Python替换某些列
input.txt由制表符分隔 我知道一个简单的代码可以替换Python替换某些列,python,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或BBB中的任何一个,我想用0替换单元格,如果单元格不是其中任何一个,则用
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第三列的单元格(而不是整个文件input.txt),如果单元格是AA或AAA或BB或BBB中的任何一个,我想用0替换单元格,如果单元格不是其中任何一个,则用1替换,以“匹配整个单元格内容”的方式
不过,请注意,我对制表符分隔的数据采取了过于简单的看法。如果您的文件使用整个CSV/TSV格式,带引号的单元格包含制表符和/或换行符,那么您需要CSV
,这是一个合适的CSV解析器
相反,如果希望列0中包含例如“a”
的单元格输出为“a”
,则不能使用csv
,因为它在读取时会删除引号,而在写入时不会重新插入引号,因为该单元格不需要引号
因此,首先您必须确定文件格式是如何定义的,然后您可以选择如何读取和写入它。不过,无论哪种方式,修改它都差不多
另一个小问题是:我还没有对换行器做任何处理,所以它只能放在最后一个牢房里。因此,如果第三个单元格是最后一个单元格,则当该单元格被替换为“0”或“1”
时,它将被删除,这可能不是您想要的。当我们讨论单元格的数量时,如果任何一行少于3个单元格,这段代码当然会抛出一个异常。您应该决定如何处理该问题,特别是在文本文件末尾发现一个空行并不少见。您应该使用:
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)
@MartijnPieters:如果是CSV文件(好吧,TSV)。我有时遇到非TSV的制表符分隔数据。@MartijnPieters我的输入将是txt,制表符分隔,UTF8,不带BOM表。txt文件也可以是csv文件?那么如何检查我的输入是否为csv?@user2604484:csv是一种文本格式;它是包含由分隔符分隔的数据列的任何文本文件,可以是逗号、管道符号、制表符或其他任何内容。@user2604484:csv
模块允许您读取和写入格式,只需将分隔符设置为\t
,如果在读卡器上设置csv.QUOTE\u NONE
,则仅此而已。否则csv就没那么简单了。提问者需要找出文件中任何“
字符的预期含义,并相应地分析文件。@Steve_Jessop“如果第三个单元格是最后一个单元格,当该单元格被“0”或“1”替换时,它将被删除,这可能不是您想要的。“哦,第三栏很可能是最后一栏。我应该怎么做?我的输入将是txt,制表符分隔,UTF8,没有BOM。txt文件也可以是csv文件?那么,我如何检查输入是否为csv?@user2604484:“那么我该怎么办?”--可能最好在打开\t
拆分之前将换行符取下,然后在打印时将其重新打开。“我如何检查输入是否为csv?”。您不会检查它是否为CSV(注意,“制表符分隔值”是CSV的一个变体,它使用不同的分隔符而不是逗号,因此出于这些目的,将其计为CSV)。您需要与提供该文件的人就其格式达成一致。两个相同的文件可以有不同的含义,这取决于它们是被指定为TSV,还是被指定为简单的制表符分隔数据,文件的每个文件都有一条记录。我的意思是,文件的每行都有一条记录。我运行了你的程序,在我运行了你的程序之后,input.txt的内容似乎被删除了。但是output.txt似乎是正确的。因此,如果您的程序可以保持input.txt原样,那么它将是完美的:)@user2604484:我无法想象为什么会发生这种情况,因为我正在打开input.txt
,以供阅读。你能再检查一下吗?
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)