Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python替换某些列_Python - Fatal编程技术网

Python替换某些列

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替换单元格,如果单元格不是其中任何一个,则用

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第三列的单元格(而不是整个文件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)