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

如何使用Python Difflib仅输出两个文件对比中的新增内容

基于Python difflib提取文本对比中的纯新增行

场景说明

difflib.ndiff()的输出中,+ 前缀会同时标记「原有行修改后的新内容」和「完全新增的无对应旧行的内容」,无法直接区分,以下提供两种适配不同需求的解决方案:

方案1:提取旧文件中完全不存在的新行

如果你的需求是只要新文件中出现过、旧文件中从未出现过的行(不考虑行的位置顺序),可以直接用集合快速比对,实现最简单:

# 读取旧文件所有行存入集合,自动去重
with open(old_file_name, 'r', encoding='utf-8') as f:
    old_line_set = {line.rstrip('\n') for line in f}
# 读取新文件所有行
with open(file_name, 'r', encoding='utf-8') as f:
    new_line_list = [line.rstrip('\n') for line in f]
# 筛选旧集合中不存在的行
pure_new_lines = [line for line in new_line_list if line not in old_line_set]

方案2:按对比位置提取无对应修改的纯插入行

如果你的需求是保留行的位置逻辑,排除「原有行修改产生的+行」,仅保留没有对应旧行删除的纯插入行,可以通过解析ndiff的配对规则实现:

import difflib

with open(old_file_name, 'r', encoding='utf-8') as f:
    old_lines = f.readlines()
with open(file_name, 'r', encoding='utf-8') as f:
    new_lines = f.readlines()

diff_result = list(difflib.ndiff(old_lines, new_lines))
pure_new_lines = []
skip_next_plus = False

for idx in range(len(diff_result)):
    current_line = diff_result[idx]
    # 跳过前序删除行标记的需要忽略的修改类+行
    if skip_next_plus:
        skip_next_plus = False
        continue
    # 检测到删除行后紧跟新增行,判定为修改操作,标记跳过下一个+行
    if current_line.startswith('- '):
        if idx + 1 < len(diff_result) and diff_result[idx+1].startswith('+ '):
            skip_next_plus = True
        continue
    # 跳过无变化的上下文行
    if current_line.startswith('  '):
        continue
    # 剩余的+行即为纯新增行,去掉前缀后存入结果
    if current_line.startswith('+ '):
        pure_new_lines.append(current_line[2:].rstrip('\n'))

逻辑说明

ndiff输出中,行内容修改的操作会固定生成- 旧行内容紧接着+ 新行内容的配对结构,我们只要提前识别这种配对,跳过对应的修改类+行,剩下的+行就都是没有对应旧行的纯插入行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:18:01