如何使用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
相关产品推荐
相关产品推荐

