使用difflib实现文件差异比较用html显示

1.默认方式,其中加入文本过长,需要换行,因此做

content=html_output.replace('</style>','table.diff td {word-wrap: break-word;white-space: pre-wrap;max-width: 100%;}</style>'),添加换行操作
ps:当前text1输入是列表格式,返回是按照行形式(如果text1输入的是字符串,返回是按照形式)
#coding:utf-8
import difflib

text1 = '''尊敬的韦尔总理、尊敬的汉恩党委书记、王省长、总领事、
女士们和先生们,
今天我非常高兴与你们共同庆祝40年的伙伴关系。'''.splitlines(keepends=True)
#
text2 = '''尊敬的韦尔总理,汉恩党委书记,王省长,总领事,
女士们,先生们,
今天我很高兴与你们一起庆祝四十年的伙伴关系。'''.splitlines(keepends=True)
html_diff = difflib.HtmlDiff()
html_output = html_diff.make_file(text1, text2)

content=html_output.replace('</style>','table.diff td {word-wrap: break-word;white-space: pre-wrap;max-width: 100%;}</style>')
with open('diff_output_huanhang.html', 'w',encoding="utf-8") as fw:
    fw.write(content)

案例展示:

2.方式1直接调用difflib.HtmlDiff()存在一个问题,在复杂场景下不能针对文本很好的比对(小伙伴们有好的方案可以推荐,当前输入字符串按列展示没有问题,但看着不舒服),因此使用diff_match_patch或者difflib.SequenceMatcher,进行修改,当前以diff_match_patch演示

#coding:utf-8
import diff_match_patch
def read(file):
    with open(file, 'r', encoding="utf-8") as fr:
        content=fr.read()
    return content

html_cont = read("diff_baseline.html")

text1 = '''尊敬的韦尔总理、汉恩党委书记、王省长、总领事、女士们和先生们,今天我非常高兴与你们共同庆祝40年的伙伴关系。我们作为AHK只做了三十年。我认为这是一个感谢前任的机会,他们为这种伙伴关系付出了很多努力。这种伙伴关系不仅存在于纸面上,还存在于实践中。我认为目前是我们塑造未来40年的关键时期,这可能比过去40年更加困难。因为中国在不断变化,所以我们设法找到并利用共同的潜力。今天政治领导人在这里向我们发出明确信号,即伙伴关系符合双方利益。我还要指出,总理。创新的公司表示愿意参与这个地区的发展,寻找并实施市场潜力。作为AHK,我们已经帮助了30年,同时我们在德国的组织和工商会也在尽我们所能支持德国公司。说话人E:我很高兴你今天发起了这个会议,我们的公司可以与中国公司见面,在那里他们可以互相交谈。他们可以达成交易的地方,我相信我们都同意,未来40年只有我们继续好好交谈、合作、做生意才会越来越好。我祝愿所有与会者和会议取得圆满成功。谢谢。
'''
text2 = '''尊敬的韦尔总理,尊敬的汉恩党委书记,王省长,总领事,女士们,先生们,今天我很高兴与你们一起庆祝四十年的伙伴关系。我们作为ahk只做了三十年。尽管如此,我认为这也是一个很好的机会来感谢我们的前任,他们为这一伙伴关系付出了如此多的努力。这种伙伴关系不仅存在于纸面上,而且存在于实践中。我认为现在是我们塑造未来四十年的时候了,我认为这可能比过去四十年要困难一些。因为我们变了。中国变了。我们会不断地改变。然而,我们一次又一次地设法找到并利用共同的潜力。由于政治领导人今天在这里向我们发出了明确的信号,即伙伴关系符合我们双方的利益,我还要指出,你,总理,带来了创新的公司,他们表现出愿意参与这个地区,这个地区,寻找市场潜力,不仅谈论潜力,而且实施潜力。作为ahk,我们已经帮助了三十年,当然还有我们在德国的组织,工商会,尽我们所能支持德国公司。eben-partner to find。我很高兴你今天发起了这个会议,在那里我们的公司可以与中国公司见面,在那里他们可以互相交谈。他们可以达成交易的地方,因为我相信我们都同意,未来四十年,只有我们继续好好交谈,好好合作,好好做生意,才会好起来。我祝愿所有与会者今天取得圆满成功,并祝愿会议取得圆满成功。谢谢,谢谢
'''
dmp = diff_match_patch.diff_match_patch()
diffs = dmp.diff_main(text1, text2)
print(diffs)
a="<td>"
b="<td>"
for i in diffs:
    if i[0]==0:
        a+=i[1]
        b+=i[1]
    if i[0]==-1:
        a+='<span class="diff_chg">{}</span>'.format(i[1])
    if i[0]==1:
        b+='<span class="diff_chg">{}</span>'.format(i[1])
a+="</td>"
b+="</td>"

one='<tr><td class="diff_next" id="difflib_chg_to0__0"><a href="#difflib_chg_to0__top">t</a></td><td class="diff_header" id="from0_1">1</td>{}<td class="diff_next"><a href="#difflib_chg_to0__top">t</a></td><td class="diff_header" id="to0_1">1</td>{}</tr>'.format(a,b)

html_cont=html_cont.replace("</tbody>",one+"</tbody>")


# 将HTML差异保存到文件中
with open('diff_output.html', 'w', encoding='utf-8') as f:
    f.write(html_cont)

样例展示:

构建html格式


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html>

<head>
    <meta http-equiv="Content-Type"
          content="text/html; charset=utf-8" />
    <title></title>
    <style type="text/css">
        table.diff {font-family:Courier; border:medium;}
        .diff_header {background-color:#e0e0e0}
        td.diff_header {text-align:right}
        .diff_next {background-color:#c0c0c0}
        .diff_add {background-color:#aaffaa}
        .diff_chg {background-color:#ffff77}
        .diff_sub {background-color:#ffaaaa}
    table.diff td {word-wrap: break-word;white-space: pre-wrap;max-width: 100%;}</style>
</head>

<body>
    
    <table class="diff" id="difflib_chg_to0__top"
           cellspacing="0" cellpadding="0" rules="groups" >
        <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup>
        <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup>
        
        <tbody>

        </tbody>
    </table>
    <table class="diff" summary="Legends">
        <tr> <th colspan="2"> Legends </th> </tr>
        <tr> <td> <table border="" summary="Colors">
                      <tr><th> Colors </th> </tr>
                      <tr><td class="diff_add">&nbsp;Added&nbsp;</td></tr>
                      <tr><td class="diff_chg">Changed</td> </tr>
                      <tr><td class="diff_sub">Deleted</td> </tr>
                  </table></td>
             <td> <table border="" summary="Links">
                      <tr><th colspan="2"> Links </th> </tr>
                      <tr><td>(f)irst change</td> </tr>
                      <tr><td>(n)ext change</td> </tr>
                      <tr><td>(t)op</td> </tr>
                  </table></td> </tr>
    </table>
</body>

</html>

3.当前以difflib.SequenceMatcher演示

#coding:utf-8
import difflib, re
def read(file):
    with open(file, 'r', encoding="utf-8") as fr:
        content=fr.read()
    return content
html_cont = read("diff_baseline.html")
# 比较两个文本差异点
def compare_text_index(text1, text2):
    # 创建SequenceMatcher对象
    matcher = difflib.SequenceMatcher(a=text1, b=text2)
    # 获取差异报告
    diff_report = matcher.get_opcodes()
    index_info=[]
    # 检查差异报告中是否存在关键词错误
    for tag, i1, i2, j1, j2 in diff_report:
        index_info.append([tag, i1, i2, j1, j2])
    return index_info


text1 = '''尊敬的韦尔总理、汉恩党委书记、王省长、总领事、女士们和先生们,今天我非常高兴与你们共同庆祝40年的伙伴关系。我们作为AHK只做了三十年。我认为这是一个感谢前任的机会,他们为这种伙伴关系付出了很多努力。这种伙伴关系不仅存在于纸面上,还存在于实践中。我认为目前是我们塑造未来40年的关键时期,这可能比过去40年更加困难。因为中国在不断变化,所以我们设法找到并利用共同的潜力。今天政治领导人在这里向我们发出明确信号,即伙伴关系符合双方利益。我还要指出,总理。创新的公司表示愿意参与这个地区的发展,寻找并实施市场潜力。作为AHK,我们已经帮助了30年,同时我们在德国的组织和工商会也在尽我们所能支持德国公司。说话人E:我很高兴你今天发起了这个会议,我们的公司可以与中国公司见面,在那里他们可以互相交谈。他们可以达成交易的地方,我相信我们都同意,未来40年只有我们继续好好交谈、合作、做生意才会越来越好。我祝愿所有与会者和会议取得圆满成功。谢谢。
'''

text2 = '''尊敬的韦尔总理,尊敬的汉恩党委书记,王省长,总领事,女士们,先生们,今天我很高兴与你们一起庆祝四十年的伙伴关系。我们作为ahk只做了三十年。尽管如此,我认为这也是一个很好的机会来感谢我们的前任,他们为这一伙伴关系付出了如此多的努力。这种伙伴关系不仅存在于纸面上,而且存在于实践中。我认为现在是我们塑造未来四十年的时候了,我认为这可能比过去四十年要困难一些。因为我们变了。中国变了。我们会不断地改变。然而,我们一次又一次地设法找到并利用共同的潜力。由于政治领导人今天在这里向我们发出了明确的信号,即伙伴关系符合我们双方的利益,我还要指出,你,总理,带来了创新的公司,他们表现出愿意参与这个地区,这个地区,寻找市场潜力,不仅谈论潜力,而且实施潜力。作为ahk,我们已经帮助了三十年,当然还有我们在德国的组织,工商会,尽我们所能支持德国公司。eben-partner to find。我很高兴你今天发起了这个会议,在那里我们的公司可以与中国公司见面,在那里他们可以互相交谈。他们可以达成交易的地方,因为我相信我们都同意,未来四十年,只有我们继续好好交谈,好好合作,好好做生意,才会好起来。我祝愿所有与会者今天取得圆满成功,并祝愿会议取得圆满成功。谢谢,谢谢
'''
a="<td>"
b="<td>"
chayi=compare_text_index(text1, text2)
for effect in chayi:
    print(effect)
    if effect[0]=="equal":
        a+=text1[effect[1]:effect[2]]
        b+=text2[effect[3]:effect[4]]
    if effect[0]=="replace":
        # a+=text1[effect[1]:effect[2]]
        # b+=text2[effect[3]:effect[4]]
        a+='<span class="diff_chg">{}</span>'.format(text1[effect[1]:effect[2]])
        b += '<span class="diff_chg">{}</span>'.format(text2[effect[3]:effect[4]])
    if effect[0]=="insert":
        # a+=text1[effect[1]:effect[2]]
        # b+=text2[effect[3]:effect[4]]
        a += '<span class="diff_add">{}</span>'.format(text1[effect[1]:effect[2]])
        b += '<span class="diff_add">{}</span>'.format(text2[effect[3]:effect[4]])
    if effect[0]=="delete":
        # a+=text1[effect[1]:effect[2]]
        # b+=text2[effect[3]:effect[4]]
        a += '<span class="diff_sub">{}</span>'.format(text1[effect[1]:effect[2]])
        b += '<span class="diff_sub">{}</span>'.format(text2[effect[3]:effect[4]])


a+="</td>"
b+="</td>"

one='<tr><td class="diff_next" id="difflib_chg_to0__0"><a href="#difflib_chg_to0__top">t</a></td><td class="diff_header" id="from0_1">1</td>{}<td class="diff_next"><a href="#difflib_chg_to0__top">t</a></td><td class="diff_header" id="to0_1">1</td>{}</tr>'.format(a,b)

html_cont=html_cont.replace("</tbody>",one+"</tbody>")

# 将HTML差异保存到文件中
with open('difflib_output.html', 'w', encoding='utf-8') as f:
    f.write(html_cont)

案例展示:

4.同理将多个文本按行比对:

#coding:utf-8
import diff_match_patch
def read(file):
    with open(file, 'r', encoding="utf-8") as fr:
        content=fr.read()
    return content

html_cont = read("diff_baseline.html")

text11 = read("text1.txt").splitlines(keepends=True)

text22 = read("text2.txt").splitlines(keepends=True)

one=""
for id,text1 in enumerate(text11):
    text2=text22[id]
    dmp = diff_match_patch.diff_match_patch()
    diffs = dmp.diff_main(text1, text2)

    if id==0:
        a="<td>"
        b="<td>"
        for i in diffs:
            if i[0]==0:
                a+=i[1]
                b+=i[1]
            if i[0]==-1:
                a+='<span class="diff_chg">{}</span>'.format(i[1])
            if i[0]==1:
                b+='<span class="diff_chg">{}</span>'.format(i[1])
        a+="</td>"
        b+="</td>"
        print(a)
        print(b)
        one+='<tr><td class="diff_next" id="difflib_chg_to0__0"><a href="#difflib_chg_to0__top">t</a></td><td class="diff_header" id="from0_1">1</td>{}<td class="diff_next"><a href="#difflib_chg_to0__top">t</a></td><td class="diff_header" id="to0_1">1</td>{}</tr>'.format(a,b)
    if id>0:
        a = "<td>"
        b = "<td>"
        for i in diffs:
            if i[0] == 0:
                a += i[1]
                b += i[1]
            if i[0] == -1:
                a += '<span class="diff_chg">{}</span>'.format(i[1])
            if i[0] == 1:
                b += '<span class="diff_chg">{}</span>'.format(i[1])
        a += "</td>"
        b += "</td>"
        print(a)
        print(b)
        one += '<tr><td class="diff_next"></td><td class="diff_header" id="from0_{}">{}</td>{}<td class="diff_next"></td><td class="diff_header" id="to0_{}">{}</td>{}</tr>'.format(id+1,id+1,a,id+1,id+1, b)

html_cont=html_cont.replace("</tbody>",one+"</tbody>")


# 将HTML差异保存到文件中
with open('diff_output1.html', 'w', encoding='utf-8') as f:
    f.write(html_cont)

#coding:utf-8
import diff_match_patch,difflib
def read(file):
    with open(file, 'r', encoding="utf-8") as fr:
        content=fr.read()
    return content
# 比较两个文本差异点
def compare_text_index(text1, text2):
    # 创建SequenceMatcher对象
    matcher = difflib.SequenceMatcher(a=text1, b=text2)
    # 获取差异报告
    diff_report = matcher.get_opcodes()
    index_info=[]
    # 检查差异报告中是否存在关键词错误
    for tag, i1, i2, j1, j2 in diff_report:
        index_info.append([tag, i1, i2, j1, j2])
    return index_info


html_cont = read("diff_baseline.html")

text11 = read("text1.txt").splitlines(keepends=True)

text22 = read("text2.txt").splitlines(keepends=True)

one=""
for id,text1 in enumerate(text11):
    text2=text22[id]
    chayi=compare_text_index(text1, text2)
    if id==0:
        a="<td>"
        b="<td>"
        for effect in chayi:
            print(effect)
            if effect[0] == "equal":
                a += text1[effect[1]:effect[2]]
                b += text2[effect[3]:effect[4]]
            if effect[0] == "replace":
                # a+=text1[effect[1]:effect[2]]
                # b+=text2[effect[3]:effect[4]]
                a += '<span class="diff_chg">{}</span>'.format(text1[effect[1]:effect[2]])
                b += '<span class="diff_chg">{}</span>'.format(text2[effect[3]:effect[4]])
            if effect[0] == "insert":
                # a+=text1[effect[1]:effect[2]]
                # b+=text2[effect[3]:effect[4]]
                a += '<span class="diff_add">{}</span>'.format(text1[effect[1]:effect[2]])
                b += '<span class="diff_add">{}</span>'.format(text2[effect[3]:effect[4]])
            if effect[0] == "delete":
                # a+=text1[effect[1]:effect[2]]
                # b+=text2[effect[3]:effect[4]]
                a += '<span class="diff_sub">{}</span>'.format(text1[effect[1]:effect[2]])
                b += '<span class="diff_sub">{}</span>'.format(text2[effect[3]:effect[4]])
        a+="</td>"
        b+="</td>"
        print(a)
        print(b)
        one+='<tr><td class="diff_next" id="difflib_chg_to0__0"><a href="#difflib_chg_to0__top">t</a></td><td class="diff_header" id="from0_1">1</td>{}<td class="diff_next"><a href="#difflib_chg_to0__top">t</a></td><td class="diff_header" id="to0_1">1</td>{}</tr>'.format(a,b)
    if id>0:
        a = "<td>"
        b = "<td>"
        for effect in chayi:
            print(effect)
            if effect[0] == "equal":
                a += text1[effect[1]:effect[2]]
                b += text2[effect[3]:effect[4]]
            if effect[0] == "replace":
                # a+=text1[effect[1]:effect[2]]
                # b+=text2[effect[3]:effect[4]]
                a += '<span class="diff_chg">{}</span>'.format(text1[effect[1]:effect[2]])
                b += '<span class="diff_chg">{}</span>'.format(text2[effect[3]:effect[4]])
            if effect[0] == "insert":
                # a+=text1[effect[1]:effect[2]]
                # b+=text2[effect[3]:effect[4]]
                a += '<span class="diff_add">{}</span>'.format(text1[effect[1]:effect[2]])
                b += '<span class="diff_add">{}</span>'.format(text2[effect[3]:effect[4]])
            if effect[0] == "delete":
                # a+=text1[effect[1]:effect[2]]
                # b+=text2[effect[3]:effect[4]]
                a += '<span class="diff_sub">{}</span>'.format(text1[effect[1]:effect[2]])
                b += '<span class="diff_sub">{}</span>'.format(text2[effect[3]:effect[4]])
        a += "</td>"
        b += "</td>"
        print(a)
        print(b)
        one += '<tr><td class="diff_next"></td><td class="diff_header" id="from0_{}">{}</td>{}<td class="diff_next"></td><td class="diff_header" id="to0_{}">{}</td>{}</tr>'.format(id+1,id+1,a,id+1,id+1, b)

html_cont=html_cont.replace("</tbody>",one+"</tbody>")


# 将HTML差异保存到文件中
with open('diff_output.html', 'w', encoding='utf-8') as f:
    f.write(html_cont)

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-06-08 10:12:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-08 10:12:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-08 10:12:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-08 10:12:03       18 阅读

热门阅读

  1. npm发布自己的插件包

    2024-06-08 10:12:03       8 阅读
  2. ubantu安装第三库到指定目录

    2024-06-08 10:12:03       9 阅读
  3. C#面:AJAX的底层实现原理

    2024-06-08 10:12:03       9 阅读
  4. 类的定义和对象的引用

    2024-06-08 10:12:03       9 阅读
  5. c++ 左右值与引用折叠

    2024-06-08 10:12:03       9 阅读
  6. 【例0808】create daxis using face 使用面创建基准轴

    2024-06-08 10:12:03       8 阅读
  7. 【Linux】GNU编译器基础

    2024-06-08 10:12:03       6 阅读
  8. 微信小程序按钮设计与交互:打造极致用户体验

    2024-06-08 10:12:03       7 阅读
  9. cocos入门6:向量简介

    2024-06-08 10:12:03       8 阅读