用Python将文本文件中以逗号分隔的单词替换为特定列的单词

1 投票
3 回答
977 浏览
提问于 2025-04-18 09:01

抱歉,我刚开始学习Python,需要一些帮助。

我有一个像下面这样的列表:

$ cat server.txt
column1, column2, column3, column4, column5
server1, windows, 120, running , 1
server2, linux, 250, offline , 1
server3, centos, 60, maintenance, 0
server4, windows, 123, running, 1
server5, linux, 145, offline, 0

我需要把第二列的值替换成其他的,比如:

把第五列中的所有1替换成noissue,把0替换成issue,但只在第五列进行替换,因为我不想让第三列受到影响。

非常感谢!

3 个回答

0

你可以这样做:

mapping = {'0':'issue', '1':'noissue'}
for line in sys.stdin:
  fields = line.split(',')
  if fields[4].strip() in mapping:
    fields[4] = mapping[fields[4].strip()]
  print ','.join(fields)

这个方法会在标准输入上运行,并且输出到标准输出,所以你需要像这样调用你的程序:

$ python program.py < server.txt > output.txt

如果这一列里既没有“0”也没有“1”,那么这个值就不会改变。如果你想要改变其他的值,可以调整mapping

要注意,这个程序并没有单独处理第一行(可以看看julinenc的帖子,了解怎么处理第一行)。因为你的第一行里没有“0”或“1”,所以它会在你提供的例子中正常工作。

另外要注意使用strip()方法,这个方法可以去掉你“0”和“1”周围可能多余的空格。

0

你应该使用 csv 模块来处理这个问题:

import csv

with open('server.txt', 'r') as infile, open('server_modified.txt','w') as outfile:
   reader = csv.reader(infile, delimiter=',')  # ',' is the default, but this shows
                                               # you how to change it in the future
   writer = csv.writer(outfile, delimiter=',')
   writer.writerow(next(reader)) # This will write the first row (your header)
                                 # directly to the output file

   for row in reader:
      if row[-1] == '1':
         row[-1] = 'noissue'

      if row[-1] == '0':
         row[-1] = 'issue'

      writer.writerow(row)
1

如果你确定要替换的那一列只包含0和1,这样做是没问题的。

firstline = True
with open("server.txt") as f:
    with open("output.txt", "w") as fw:
        for line in f.readlines(): # For each line in server.txt

            if firstline: # Do not process the header line
                firstline = False
                continue

            if line[-2] == "1": # -2 because -1 is the line return character
                line = line[:-2] + "noissue\n"
            else:
                line = line[:-2] + "issue\n"
            fw.write(line)

撰写回答