input.txt是制表符分隔的。
我知道要替换的简单代码。
import fileinput
for line in fileinput.FileInput("input.txt",inplace=1):
line = line.replace("AA","0")
print line,
但是,我想替换input.txt的第3列(不是整个文件input.txt)的单元格,如果它是AA或AAA或BB中的任何一个,我想将单元格替换为0或者BBB,如果不是任何一个单元格,则将单元格替换为1。
在这里,我说的是“匹配整个单元格内容”
通过“匹配整个单元格内容”我的意思是,只有当一个单元格(例如input.txt的(2,3)元素)正好是AA或AAA或BB或BBB时才会被替换。像“AAs”这样的单元格不会被任何东西取代。
相反,如果未应用“匹配整个单元格内容”,则只要单元格仅“包含”AA或AAA或BB或BBB,它就会被替换。所以一个单元格“AAhaha”将被“0haha”取代
无论如何,重复一下,我想替换input.txt的第3列(不是整个文件input.txt)的单元格,如果它是AA或AAA中的任何一个,我想要将单元格替换为0或BB或BBB,如果不是任何一个单元格,则在“匹配整个单元格内容”的方式中将单元格替换为1。
答案 0 :(得分:2)
for line in fileinput.FileInput("input.txt",inplace=1):
cells = line.split('\t')
cells[2] = '0' if cells[2] in ('AA', 'AAA', 'BB', 'BBB') else '1'
print '\t'.join(cells),
但要注意,我对制表符分隔的数据采取了简单的观点。如果您的文件使用整个CSV / TSV格式,并且带引号的单元格包含制表符和/或换行符,那么您需要csv
,这是一个正确的CSV解析器。
相反,如果您希望将包含例如"a"
的第0列中的单元格输出为"a"
,那么您必须不使用csv
,因为它将在阅读时删除引号,而不是在写入时重新插入引号,因为该单元不需要它们。
因此,首先您必须确定文件格式的定义方式,然后您可以选择如何读取和写入文件格式。无论哪种方式,修改它都会大致相同。
另一个小问题:我没有对换行做任何事情,所以它只会坐在最后一个单元格中。因此,如果第三个单元格 最后一个单元格,当单元格被"0"
或"1"
替换时,它将被移除,这可能不是您想要的。虽然我们讨论的是单元格的数量,但如果任何一行少于3个单元格,这个代码当然会抛出异常。您应该决定如何处理它,特别是在文本文件末尾找到一个空行并不常见。
答案 1 :(得分:1)
您应该使用csv
module:
import csv
with open("input.txt", "rb") as infile, open("output.txt", "wb") as outfile:
reader = csv.reader(infile, delimiter="\t")
writer = csv.writer(outfile, delimiter="\t")
for row in reader:
row[2] = "0" if row[2] in ("AAA", "AA", "BBB", "BB") else "1"
writer.writerow(row)