我是一个Python初学者,想学习如何使用它来操作文本文件。我有一个输入txt文件,其中有4列,用TAB分隔,我想逐行搜索第1列和第4列中的单元格对是否同时包含模式“BBB”或“CCC”。如果为真,则将整行发送到output 1。如果为假,则将整行发送到output 2。
下面是输入.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代码:
第一次
命令:
python main.py input.txt output1.txt output2.txt
输出1.txt正确
第一个
output 2是不正确的。我试图理解为什么它同时接受output1.txt的行和其他行的双重副本。
第一个
输出2.txt应为:
AABBBAA 2 5 AACCCAA
AAAAAAA 4 10 AAAAAAA
AAAAAAA 8 20 AAAAAAA
AAAAAAA 12 30 AAAAAAA
谢谢你的帮助!
2条答案
按热度按时间sdnqo3pr1#
您在
output2
中得到重复的行,因为您要求它这样做。您的条件是:如果item
存在于两列中,则将该行写入output1
,否则写入output2
。然后对list
中的每个item
执行此操作。由于list
中有两个项,并且(例如,在第1行中)第一项不存在于两列中,它将该行一次写入output2
,然后第二项也不存在于两列中,因此其再次将所述行写入到output2
。让我们重申一下你的情况:
[检查]第1列和第4列中的单元格对是否同时包含模式“BBB”或“CCC”。如果是,则将整行发送到输出1。如果是,则将整行发送到输出2。
因此,对于每一行,您需要检查
list
(for item in lst
)中的 * 任何 *(any
)项是否出现在 * 这两个 * 列(item in cols[0] and item in cols[3]
)中。请注意,我在代码中将
list
重命名为lst
,将input
重命名为input_file
,以避免隐藏内置函数q0qdq0h22#
问题出在
if
语句的else
部分,因为每次if
条件没有返回True
时,您都将该行写入output2.txt文件,这不是您想要的逻辑。如果同时找不到'BBB'和'CCC',您需要更改代码的逻辑,使其仅写入output2.txt。