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

Python 3中比较文本文件并保留新行原顺序的实现方法

解决TXT文件对比时保留原行顺序的问题

这个问题我太熟了!你碰到的无序问题确实是因为用了set——集合是不保留元素顺序的,所以你取两个集合的差集时,输出顺序就完全乱掉了。要保留原文件的行顺序,我们只需要调整一下思路:不要把原文件的行转成集合,而是用集合存另一个文件的行来做快速查找,再按顺序遍历原文件的每一行。

核心思路

  1. 把attlog.dat(f2)的所有行存入一个集合,这样判断某行是否存在的速度是O(1),效率很高;
  2. 按顺序遍历1_attlog.dat(f1)的每一行,只要该行不在f2的集合里,就写入新文件;
  3. 全程保持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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:50:43