Python difflib生成HTML差异:行内变更与整行增删的差异原因
问题
我创建了两个文件(内容如下),并使用difflib.make_file对它们进行比对。在生成的HTML文件中,为什么第1-3行显示每行内的具体变更,而第4行却显示为从diff_text1中删除、在diff_text2中添加?
两个文件内容
diff_text1:
The world is a big place. The galaxy is a big place. The planet is a big place. This is in file1 and not file2.
diff_text2:
This world is a large place. This galaxy is a large place. This planet is a large place. This is in file2 and not file1.
对比代码
with open("diff_text1.txt", "r") as d1: diff_text1 = d1.readlines() with open("diff_text2.txt", "r") as d2: diff_text2 = d2.readlines() # 假设h是difflib.HtmlDiff实例 result4 = h.make_file(diff_text1, diff_text2) print(result4)
生成的HTML关键差异行
<tbody> <tr><td class="diff_next" id="difflib_chg_to14__0"><a href="#difflib_chg_to14__top">t</a></td><td class="diff_header" id="from14_1">1</td><td nowrap="nowrap">Th<span class="diff_chg">e</span> world is a <span class="diff_chg">bi</span>g place.</td><td class="diff_next"><a href="#difflib_chg_to14__top">t</a></td><td class="diff_header" id="to14_1">1</td><td nowrap="nowrap">Th<span class="diff_chg">is</span> world is a <span class="diff_chg">lar</span>g<span class="diff_add">e</span> place.</td></tr> <tr><td class="diff_next"></td><td class="diff_header" id="from14_2">2</td><td nowrap="nowrap">Th<span class="diff_chg">e</span> galaxy is a <span class="diff_chg">bi</span>g place.</td><td class="diff_next"></td><td class="diff_header" id="to14_2">2</td><td nowrap="nowrap">Th<span class="diff_chg">is</span> galaxy is a <span class="diff_chg">lar</span>g<span class="diff_add">e</span> place.</td></tr> <tr><td class="diff_next"></td><td class="diff_header" id="from14_3">3</td><td nowrap="nowrap">Th<span class="diff_chg">e</span> planet is a <span class="diff_chg">bi</span>g place.</td><td class="diff_next"></td><td class="diff_header" id="to14_3">3</td><td nowrap="nowrap">Th<span class="diff_chg">is</span> planet is a <span class="diff_chg">lar</span>g<span class="diff_add">e</span> place.</td></tr> <tr><td class="diff_next"></td><td class="diff_header" id="from14_4">4</td><td nowrap="nowrap"><span class="diff_sub">This is in file1 and not file2.</span></td><td class="diff_next"></td><td class="diff_header" id="to14_4">4</td><td nowrap="nowrap"><span class="diff_add">This is in file2 and not file1.</span></td></tr> </tbody>
原因分析
这是difflib的行相似度匹配逻辑在起作用:
difflib对比两行时,会先判断它们的相似程度是否达标(核心看两行的最长公共内容占比,由默认参数控制阈值)。- 第1-3行:对应行只有局部改动——比如把
The改成This、big改成large,大部分内容完全一致,相似度足够高,所以被判定为同一行的修改,会高亮显示行内具体变更的字符。 - 第4行:两行开头虽然相同,但关键内容(
file1和file2的位置互换)导致整体相似度低于阈值,difflib直接判定这是完全不同的两行,于是把原文件的行标为删除(diff_sub样式),新文件的行标为添加(diff_add样式),不会再去解析行内的局部差异。
内容的提问来源于stack exchange,提问作者Dimurof82
相关产品推荐
相关产品推荐

