Python 3中比较文本文件并保留新行原顺序的实现方法
解决TXT文件对比时保留原行顺序的问题
这个问题我太熟了!你碰到的无序问题确实是因为用了set——集合是不保留元素顺序的,所以你取两个集合的差集时,输出顺序就完全乱掉了。要保留原文件的行顺序,我们只需要调整一下思路:不要把原文件的行转成集合,而是用集合存另一个文件的行来做快速查找,再按顺序遍历原文件的每一行。
核心思路
- 把
attlog.dat(f2)的所有行存入一个集合,这样判断某行是否存在的速度是O(1),效率很高; - 按顺序遍历
1_attlog.dat(f1)的每一行,只要该行不在f2的集合里,就写入新文件; - 全程保持f1的行顺序不变,完美解决无序问题。
修改后的代码
with open("C:/Temp/1_attlog.dat", "r") as f1, \ open("C:/Temp/attlog.dat","r") as f2, \ open("C:/Temp/attlog_new.dat", "w") as n: # 将f2的所有行存入集合,用于快速判断行是否存在 existing_lines = set(f2.read().splitlines()) # 按原顺序遍历f1的每一行 for line in f1.read().splitlines(): if line not in existing_lines: # 写入时补回换行符(splitlines()会去掉原换行) n.write(line + '\n')
额外优化(处理换行符兼容)
如果担心不同系统的换行符差异(比如Windows的\r\n和Linux的\n),可以改用readlines()保留原换行符,再统一处理行内容:
with open("C:/Temp/1_attlog.dat", "r") as f1, \ open("C:/Temp/attlog.dat","r") as f2, \ open("C:/Temp/attlog_new.dat", "w") as n: # 去除换行符后存入集合,避免换行符干扰判断 existing_lines = set(line.rstrip('\r\n') for line in f2.readlines()) # 遍历f1的每一行,原样保留原换行符 for line in f1.readlines(): stripped_line = line.rstrip('\r\n') if stripped_line not in existing_lines: n.write(line)
这样既保证了原文件的行顺序,又兼顾了效率和换行符兼容性,完全解决你的问题~
内容的提问来源于stack exchange,提问作者Morris
相关产品推荐
相关产品推荐

