Python替换某些列

时间:2013-11-01 12:44:44

标签: python

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。

2 个答案:

答案 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)