如何保留文本文件中仅出现一次的行?现有去重代码无法满足需求
如何保留文件中仅出现一次的行(彻底移除所有重复行)
你的原代码问题在于它只是做了去重保留首次出现——重复的行只删掉后续出现的,但你要的是只要行重复过(出现次数≥2)就全部移除,只留下那些只出现过一次的行。要实现这个需求,我们需要先统计每行的出现次数,再根据筛选条件写入新文件。
解决方案步骤
核心思路是先遍历一次文件统计每行的出现次数,再遍历一次文件只写入出现次数为1的行:
方法一:分两次读取文件(适合大文件,内存占用低)
# 第一步:统计每行的出现次数 line_counts = {} with open("test.txt", "r") as input_file: for line in input_file: # 去掉换行符,避免因为换行符导致相同内容被误判为不同行 stripped_line = line.rstrip('\n') line_counts[stripped_line] = line_counts.get(stripped_line, 0) + 1 # 第二步:写入仅出现一次的行 with open("unique_lines.txt", "w") as output_file: with open("test.txt", "r") as input_file: for line in input_file: stripped_line = line.rstrip('\n') if line_counts[stripped_line] == 1: output_file.write(line)
方法二:一次性读取所有行(适合小文件,代码更简洁)
如果你的文件不大,可以一次性把所有行读入内存,这样只需要打开文件两次(读+写):
# 读取所有行 with open("test.txt", "r") as f: lines = f.readlines() # 统计每行出现次数 line_counts = {} for line in lines: stripped = line.rstrip('\n') line_counts[stripped] = line_counts.get(stripped, 0) + 1 # 筛选并写入结果 with open("unique_lines.txt", "w") as f: for line in lines: stripped = line.rstrip('\n') if line_counts[stripped] == 1: f.write(line)
关键细节说明
- 为什么用
rstrip('\n')而不是strip()?因为如果你的行内容前后有空格(比如001010),strip()会去掉这些空格,可能导致统计错误。rstrip('\n')只去掉末尾的换行符,保留行的原始内容(除了换行符)。 - 如果你的文件里行的换行符是
\r\n(Windows格式),可以改成rstrip('\r\n'),或者直接用rstrip()只去掉末尾的空白字符(不影响内容的话)。
验证结果
针对你的test.txt内容(假设每行是单独的字符串):
010101 001010 010101 000011 111111 010101
运行代码后,unique_lines.txt会得到:
001010 000011 111111
完全符合你的需求。
内容的提问来源于stack exchange,提问作者accbizzle
相关产品推荐
相关产品推荐

