2013-11-01 100 views
1

input.txt是制表符分隔的。替换某些列的Python

我知道一个简单的代码来替换。

import fileinput 
for line in fileinput.FileInput("input.txt",inplace=1): 
    line = line.replace("AA","0") 
    print line, 

但是,我想仅更换input.txt中(而不是整个文件input.txt中)的第3列的细胞,也想通过0替换的细胞,如果它是或AA中的任一项AAA或BB或BBB,如果不是它们中的任何一个,则将其替换为1。

在这里,我说的是“匹配整个单元格内容”

通过“匹配整个单元格内容,”我的意思是,它会被替换,只有当一个细胞(如(2,3) - 元素input.txt)完全是AA或AAA或BB或BBB。诸如“AAs”的单元不会被任何东西取代。相反,如果没有应用“匹配全部细胞内容物”,则只要细胞仅“包含”AA或AAA或BB或BBB,它就会被替换。所以一个单元格“AAhaha”将被替换为“0haha”

无论如何,重复一遍,我想替换input.txt的第三列(而不是整个文件input.txt)的单元格,我想如果它是AA或AAA或BB或BBB中的任何一个,则将单元替换为0,如果它不是其中任何一个,则以“匹配整个单元内容”方式替换单元1。

+0

@MartijnPieters:如果它是一个CSV文件(当然,TSV)。我有时遇到了不是TSV的制表符分隔的数据。 –

+0

@MartijnPieters我的输入是txt,制表符分隔,UTF8没有BOM。一个txt文件也可以是csv?那我怎么检查我的输入是否是csv? – user1849133

+0

@ user2604484:CSV是一种文本格式;它是包含由分隔符分隔的数据列的任何文本文件,可以是逗号,管道符号,选项卡或任何其他文件。 –

回答

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解析器。

相反,如果你想在列0细胞含有例如"a"以输出为"a",则必须使用csv,因为读书时,它会删除引号,而不是重新插入他们的作品。因为他们不是那个单元所需要的。

所以,首先你必须确定文件格式是如何定义的,然后你可以选择如何读写它。无论哪种方式,修改它将大致相同。

另外一个问题:我没有做任何关于linebreak的事情,所以它只会坐在最后一个单元格中。因此,如果第三个单元格最后一个单元格,它将在单元格被替换为"0""1"时删除,这可能不是您想要的。虽然我们在谈论单元的数量,但如果任何一行少于3个单元,这段代码当然会抛出异常。您应该决定如何处理该问题,特别是在文本文件末尾找到空白行并不罕见。

+0

@Steve_Jessop“如果第三个单元格是当单元格替换为” 0“或”1“,这可能不是你想要的”哦,第3列确实可能是最后一列,我该怎么办呢? – user1849133

+0

我的输入是txt,制表符分隔,UTF8没有BOM。txt文件也可以是csv?那么我怎样才能检查我的输入是csv? – user1849133

+0

@ user2604484:“我该怎么做?” - 可能最好在分割'\ t'之前关闭换行符,然后在打印时将其重新打开 –

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) 
+0

我运行了你的程序,它似乎是内容的input.txt被删除后,我运行你的程序。output.txt似乎是正确的,所以如果你的程序可以保持input.txt一样,那么它将是完美:) – user1849133

+0

@ user2604484:我可以'想象为什么这样因为我正在打开'input.txt'只读。你能重新检查吗? –