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

