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

使用difflib的context_diff实现仅打印文件差异行的方法

解决difflib.context_diff比对JSON时输出多余无差异行的问题

问题原因

  • difflib.context_diff方法默认参数n=3,会输出差异行前后3行的上下文内容,这就是Age、Company等无差异行被输出的原因
  • 原代码存在方法名拼写错误:Python文件对象的读行方法为全小写的readlines(),readLines()会触发属性不存在报错
  • 原代码未手动关闭文件句柄,存在资源泄漏风险,推荐使用with语句自动管理文件资源

实现方案(仅输出带!标记的差异行)

方案1:直接过滤行比对结果

适合不需要处理JSON格式差异的场景:

import difflib

with open("filename1.json", "r", encoding="utf-8") as f1, open("filename2.json", "r", encoding="utf-8") as f2:
    lines1 = f1.readlines()
    lines2 = f2.readlines()

# 配置n=0取消上下文输出,同时过滤仅保留!开头的差异行
diff = difflib.context_diff(lines1, lines2, n=0)
delta = ''.join(line for line in diff if line.startswith('!'))
print(delta)

运行输出结果:

! "Name" : "John",
! "Name" : "Mel",
! "Occupation" : "Manager", 
! "Occupation" : "Developer", 

方案2:先解析JSON再比对(推荐)

避免JSON换行、缩进、空格等格式差异导致的误判:

import json
import difflib

with open("filename1.json", "r", encoding="utf-8") as f1, open("filename2.json", "r", encoding="utf-8") as f2:
    # 加载为字典后重新格式化为统一缩进的行内容,消除格式差异
    json1 = json.dumps(json.load(f1), indent=4, ensure_ascii=False).splitlines(keepends=True)
    json2 = json.dumps(json.load(f2), indent=4, ensure_ascii=False).splitlines(keepends=True)

diff = difflib.context_diff(json1, json2, n=0)
delta = ''.join(line for line in diff if line.startswith('!'))
print(delta)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:27:03