You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python文本文件双列模式匹配:行分类输出重复行问题排查

问题分析与解决:文本文件分类重复行问题

问题背景

处理四列TAB分隔的input.txt文件,需求为逐行检查第1列和第4列是否同时包含同一个关键词("BBB"或"CCC"):符合条件的行写入output1.txt,不符合的写入output2.txt。现有代码运行后output1.txt结果正确,但output2.txt出现重复行,且错误包含了output1.txt中的行。

输入文件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

原代码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()

错误的output2.txt表现:

每行重复出现2次,且包含本应属于output1.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

问题原因

  1. 重复遍历导致多次写入:内层循环遍历["BBB", "CCC"],每行被处理2次,不符合条件的行每次都会写入output2.txt,因此出现重复行。
  2. 逻辑判断错误:对于符合条件的行(比如第3行AABBBAA 6 15 AABBBAA),当遍历到"BBB"时会写入output1.txt,但遍历到"CCC"时,因为不满足条件,会再次写入output2.txt,导致该行同时出现在两个输出文件中。
  3. 重复调用split():每次判断都重新分割行,虽不影响结果,但会降低效率。

修正方法

调整逻辑:对每行只做一次判断,检查是否存在任意一个关键词同时出现在第1列和第4列。判断完成后仅写入一次对应文件,避免重复处理。同时优化代码细节,比如用with语句自动管理文件句柄,避免使用内置类型名list作为变量名。

修正后的代码:

import sys

# 用with语句自动关闭文件,避免手动close的遗漏
with open(sys.argv[1], "r") as input_file, \
     open(sys.argv[2], "w") as output1, \
     open(sys.argv[3], "w") as output2:

    keywords = ["BBB", "CCC"]

    for line in input_file:
        # 提前分割行,避免重复split操作
        columns = line.strip().split("\t")
        # 确保行有4列,避免索引越界(可选的健壮性处理)
        if len(columns) != 4:
            continue
        col1, _, _, col4 = columns
        # 检查是否存在关键词同时在col1和col4中
        matched = False
        for keyword in keywords:
            if keyword in col1 and keyword in col4:
                matched = True
                break
        # 根据判断结果写入对应文件
        if matched:
            output1.write(line)
        else:
            output2.write(line)

运行命令不变:

python main.py input.txt output1.txt output2.txt

修正后output2.txt将符合预期:

AABBBAA 2   5   AACCCAA
AAAAAAA 4   10  AAAAAAA
AAAAAAA 8   20  AAAAAAA
AAAAAAA 12  30  AAAAAAA

内容的提问来源于stack exchange,提问作者Gabriele

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 05:55:32