使用Python扫描相同模式的两列成对像元

rsaldnfx  于 2022-12-02  发布在  Python
关注(0)|答案(2)|浏览(106)

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

谢谢你的帮助!

sdnqo3pr

sdnqo3pr1#

您在output2中得到重复的行,因为您要求它这样做。您的条件是:如果item存在于两列中,则将该行写入output1,否则写入output2。然后对list中的每个item执行此操作。由于list中有两个项,并且(例如,在第1行中)第一项不存在于两列中,它将该行一次写入output2,然后第二项也不存在于两列中,因此其再次将所述行写入到output2
让我们重申一下你的情况:
[检查]第1列和第4列中的单元格对是否同时包含模式“BBB”或“CCC”。如果是,则将整行发送到输出1。如果是,则将整行发送到输出2。
因此,对于每一行,您需要检查listfor item in lst)中的 * 任何 *(any)项是否出现在 * 这两个 * 列(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,以避免隐藏内置函数

q0qdq0h2

q0qdq0h22#

问题出在if语句的else部分,因为每次if条件没有返回True时,您都将该行写入output2.txt文件,这不是您想要的逻辑。
如果同时找不到'BBB'和'CCC',您需要更改代码的逻辑,使其仅写入output2.txt。

相关问题