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
问题原因
- 重复遍历导致多次写入:内层循环遍历
["BBB", "CCC"],每行被处理2次,不符合条件的行每次都会写入output2.txt,因此出现重复行。 - 逻辑判断错误:对于符合条件的行(比如第3行
AABBBAA 6 15 AABBBAA),当遍历到"BBB"时会写入output1.txt,但遍历到"CCC"时,因为不满足条件,会再次写入output2.txt,导致该行同时出现在两个输出文件中。 - 重复调用
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
相关产品推荐
相关产品推荐

