新闻详情 资讯动态

全面了解最新资讯与建站知识,洞察行业趋势。

行业资讯

版本对照问题:两份配置哪里被改过?新手用只读 diff

发布时间:2026/11/1 1:55:52
版本对照问题:两份配置哪里被改过?新手用只读 diff 大家好我是 SiKi老师。手里有两份技能配置一眼看过去差不多又说不清到底改了伤害、标签还是多了字段。有人习惯直接把新文件覆盖旧文件事后才发现改丢了。先说结论先做只读对照把差异打印出来再决定要不要改文件Python 标准库difflib就是干这个的不会动你原来的两份数据。本文在 Linux 上的 Python 3.12.15 中运行另用 3.13.5 复跑同一脚本下面引用的输出两边一致。数据全部自拟字典不读写真实项目文件。官方在线文档页面标注的小版本是 3.12.16与本机安装的 3.12.15 差一个补丁号正文以本机实测为准。一 先把配置变成可对比的文本行自拟旧版、新版两份技能配置内存字典不是真实文件OLD{skill_id:fireball,damage:100,cooldown:3.0,tags:[fire,projectile],}NEW{skill_id:fireball,damage:120,cooldown:3.0,tags:[fire,projectile,aoe],cost:15,}字典打印顺序不一定方便人眼扫。我的习惯是先做成按键排序、一行一个字段的文本再交给 diffimportjsondefconfig_lines(cfg:dict)-list[str]:lines[]forkinsorted(cfg):vcfg[k]ifisinstance(v,list):vjson.dumps(v,ensure_asciiFalse)lines.append(f{k}{v}\n)returnlines old_linesconfig_lines(OLD)new_linesconfig_lines(NEW)本地得到old: cooldown3.0 / damage100 / skill_idfireball / tags[fire, projectile] new: cooldown3.0 / cost15 / damage120 / skill_idfireball / tags[fire, projectile, aoe]这样差异会落在具体行上而不是整段挤在一起。二 用 unified_diff 一眼看增删改importdifflib unilist(difflib.unified_diff(old_lines,new_lines,fromfileconfig_v1,tofileconfig_v2,lineterm\n,))print(.join(uni))本地输出节选--- config_v1 config_v2 -1,4 1,5 cooldown3.0 -damage100 cost15 damage120 skill_idfireball -tags[fire, projectile] tags[fire, projectile, aoe]读法-是旧版有、新版没有或被替换掉的行是新版多出来的行前面没有符号的是两边相同。这里能直接看出伤害从 100 改成 120标签多了aoe还新增了cost15。官方文档说明unified_diff返回的是生成器对比的是两个字符串列表本身不做文件写入。两份完全一样时本地list(difflib.unified_diff(old_lines, old_lines, ...))长度是0不会凭空造差异。三 ndiff 和 Differ想看行内哪里不同时用行差不多、只改了一个数字时ndiff会多出带?的提示行帮你把眼睛对准改动的字符forlineindifflib.ndiff(old_lines,new_lines):ifline[:1]in-?:print(line,end)本地节选 cost15 - damage100 ? ^ damage120 ? ^ - tags[fire, projectile] tags[fire, projectile, aoe] ? Differ().compare(...)是同类思路。官方提醒?行不在任何一份输入里只是给人看的若原文里空白很多提示行可能显得绕这时用unified_diff往往更干净。还可以顺手做一层键集合对照仍然只读only_newsorted(set(NEW)-set(OLD))# [cost]changedsorted(kforkinset(OLD)set(NEW)ifOLD[k]!NEW[k])print(changed)# - [damage, tags]本地only_old为空only_new为[cost]changed为[damage, tags]和 diff 结论一致。四 只读对照前后原数据不能变对照的目的是“看清楚”不是“改掉一份”。脚本里我在 diff 前后各留一份快照old_snap,new_snapdict(OLD),dict(NEW)...# 此处跑 unified_diff / ndiff / DifferassertOLDold_snapandNEWnew_snap本地readonly_ok True。difflib吃的是你传入的列表副本内容不会回写字典也不会覆盖磁盘文件——前提是你自己不要在对照函数里open(..., w)去写回。教学建议先打印 diff人工确认后再用单独的步骤去合并或保存不要把“显示差异”和“写文件”写在同一个按钮里。补充SequenceMatcher的ratio()能给一个 0 到 1 的相似度。本地对这两段文本算出来约0.89只能当“大概有多像”的参考不能代替逐行 diff官方也提示ratio()结果可能和参数顺序有关排查时仍以 unified / ndiff 正文为准。五 一步步排查清单两份配置先落到同一种文本形式排序键、统一列表写法、统一换行。用difflib.unified_diff看增删改需要盯某个字符时再用ndiff。需要结构化结论时再算“只在旧/只在新/两边都有但值不同”三组键。全程只读对照前后对原字典、原文件做一次相等检查。确认差异无误后再单独写合并或另存不要让 diff 函数顺便覆盖旧文件。本次独立验证脚本覆盖了上面每一条在 3.12.15 和 3.13.5 上都通过。未测 HTML 差异页也未接入任何版本库命令正文只用标准库在内存里对照。你在对两份配置时有没有“看着眼熟却找不出改点”的经历可以贴一段自拟的 unified diff说说你最先核对的是哪个字段。依据Python 3.12 官方文档 difflib 模块页docs.python.org/3.12/library/difflib.html关于 unified_diff、ndiff、Differ.compare、SequenceMatcher.ratio 的说明。示例和表达原创不引用具体课程信息。

想做一个「会获客」的企业网站?

留下需求,1 小时内获取专属建站方案与透明报价。

免费咨询方案
↑