1

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 或 BBB 中的任何一个,我想用 0 替换一个单元格,替换如果它不是其中任何一个,则将单元格加 1。

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

“匹配整个单元格内容”的意思是,只有当单元格(例如 input.txt 的 (2,3) 元素)正好是 AA 或 AAA 或 BB 或 BBB 时,才会替换它。诸如“AAs”之类的单元格不会被任何东西替换。

相反,如果未应用“匹配整个单元格内容”,则只要单元格仅“包含”AA 或 AAA 或 BB 或 BBB,它将被替换。所以单元格“AAhaha”将被“0haha”替换

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

4

2 回答 2

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 格式,并且引用的单元格包含制表符和/或换行符,那么您需要csvCSV 解析器。

相反,如果您希望第 0 列中包含例如的单元格"a"输出为"a",那么您不能使用csv,因为它会在读取时删除引号,并且不会在写入时重新插入它们,因为该单元格不需要它们。

因此,首先您必须确定文件格式是如何定义的,然后您可以选择如何读取和写入它。不管怎样,修​​改它都差不多。

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

于 2013-11-01T12:49:01.683 回答
1

您应该为此使用该csv模块

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)
于 2013-11-01T12:49:14.373 回答