使用Python扫描两列的成对单元格以查找相同的模式



我是一个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。

最新更新