我是一个Python初学者,想学习如何使用它对文本文件进行操作。我有一个4列的输入文本文件,用制表符分隔,我想逐行搜索列1和列4中的单元格对是否同时包含模式"BBB"或";CCC"。如果为true,则将整行发送到output1。如果为false,则将整行输出到output2。
input.txt:
more input.txt
AABBBAA 2 5 AACCCAA
AAAAAAA 4 10 AAAAAAA
AABBBAA 6 15 AABBBAA
AAAAAAA 8 20 AAAAAAA
AACCCAA 10 25 AACCCAA
AAAAAAA 12 30 AAAAAAA
这是我写的Python代码:
more main.py
import sys
input = open(sys.argv[1], "r")
output1 = open(sys.argv[2], "w")
output2 = open(sys.argv[3], "w")
list = ["BBB", "CCC"]
for line in input:
for item in list:
if item in line.split("t")[0] and item in line.split("t")[3]:
output1.write(line)
else:
output2.write(line)
input.close()
output1.close()
output2.close()
命令:
python main.py input.txt output1.txt output2.txt
output1.txt正确
more output1.txt
AABBBAA 6 15 AABBBAA
AACCCAA 10 25 AACCCAA
output2不正确。我试图理解为什么它同时需要output1.txt行和其他行的双重副本。
more output2.txt
AABBBAA 2 5 AACCCAA
AABBBAA 2 5 AACCCAA
AAAAAAA 4 10 AAAAAAA
AAAAAAA 4 10 AAAAAAA
AABBBAA 6 15 AABBBAA
AAAAAAA 8 20 AAAAAAA
AAAAAAA 8 20 AAAAAAA
AACCCAA 10 25 AACCCAA
AAAAAAA 12 30 AAAAAAA
AAAAAAA 12 30 AAAAAAA
output2.txt应为:
AABBBAA 2 5 AACCCAA
AAAAAAA 4 10 AAAAAAA
AAAAAAA 8 20 AAAAAAA
AAAAAAA 12 30 AAAAAAA
谢谢你的帮助!
您在output2
中得到重复的行,因为您要求它这样做。您的条件是:如果item
在两列中都存在,则将该行写入output1
,否则将该行写入output2
。然后继续为list
中的每个item
执行此操作。由于list
中有两个条目,并且(例如在第1行中)第一个条目在两列中都不存在,因此将该行写入一次output2
,然后将第二个条目在两列中也不存在,因此将该行再次写入output2
。
让我们重申一下你的条件:
[检查]列1和列4中的单元格对是否同时包含模式"BBB"或";CCC"。如果为true,则将整行发送到output1。如果为false,则将整行输出到output2。
所以对于每一行,您要检查是否任何(any
)中list
(for item in lst
)中的项都出现在这些列(item in cols[0] and item in cols[3]
)。
lst = ["BBB", "CCC"]
for line in input_file:
cols = line.split("t")
if any(item in cols[0] and item in cols[3] for item in lst):
output1.write(line)
else:
output2.write(line)
注意,我在代码中将list
重命名为lst
,将input
重命名为input_file
,以避免遮蔽内置的
问题出在if
语句的else
部分。因为每次if
条件不返回True
时,您都要将该行写入output2.txt文件,这不是您想要的逻辑。
如果'BBB'和'CCC'都没有找到,您需要更改代码的逻辑,使其只写入output2.txt。