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"> Added </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)