'''
随着数据量不断增加,文本处理成为了日常工作中不可或缺的一部分。如word发送给其他人,想查看差异,表格与前一日的不同处,如果每次都需要手动比对数据的差异,那么效率无疑是非常低下的,这时候就需要用到difflib模块。
** difflib为python的标准库模块,无需安装。**
作用:对比文本之间的差异。
并且支持输出可读性比较强的HTML文档,与Linux下的diff 命令相似。
由difflib执行比较,比较的结果放到了一个html里面,只要找个浏览器打开此html文件,就能直观地看到比较结果,两份文件有差异的地方会高亮显示出来。在版本控制方面非常有用。
本文将介绍如何使用difflib类库进行文本比较,包括以下主题:
模块介绍
使用difflib进行基于行的文本比较
使用difflib进行基于字符的文本比较
输出比较结果
difflib是Python中的一个标准类库,用于比较文本文件或字符串之间的差异。它实现了多种比较算法,包括基于行的比较和基于字符的比较,并提供了多种输出格式。
该模块主要包含以下几个类和函数:
Differ:比对两个文本文件的差异,并返回差异的文本。
ndiff:用于比较两个序列(通常是字符串或列表)并显示它们之间的差异。HtmlDiff:比对两个文本文件的差异,并以HTML格式返回差异的文本。SequenceMatcher:比对两个序列(可以是字符串、列表、元组等)的差异,并返回差异的详细信息。
unified_diff:用于比对两个文本文件的差异,并以Unix diff的格式返回差异的文本。以上内容是我们使用difflib模块最常用的内容。
我们拿两日的微博热榜为例,进行比较
比较文件的差异,ndiff函数
with open("D:\data\\day1.txt",'r',encoding='UTF-8') as file1, open("D:\data\\day2.txt",'r',encoding='UTF-8') as file2:
diff = difflib.ndiff(file1.readlines(), file2.readlines())
print('\n'.join(diff))
结果:
比较文件的差异,Differ函数
with open("D:\data\\day1.txt",'r',encoding='UTF-8') as file1, open("D:\data\\day2.txt",'r',encoding='UTF-8') as file2:
Differ
增量的每一行均以双字母代码打头:
[图片上传失败...(image-be25a4-1704863384135)]
查看相似度:
with open("D:\data\\day1.txt",'r',encoding='UTF-8') as file1, open("D:\data\\day2.txt",'r',encoding='UTF-8') as file2:
d = difflib.Differ()
diff = list(d.compare(file1.readlines(), file2.readlines()))
print('\n'.join(diff))
(print部分也可以换成下面部分)
for line in diff:
print(line)
Differ 增量的每一行均以双字母代码打头:
**查看相似度 **
with open("D:\data\\day1.txt",'r',encoding='UTF-8') as file1, open("D:\data\\day2.txt",'r',encoding='UTF-8') as file2:
similarity = difflib.SequenceMatcher(None, file1.readlines(), file2.readlines()).ratio()
print(similarity)
sequenceMatcher是一个比较两个字符串并根据它们的相似性返回数据的函数。通过使用ratio(),我们将能够根据比率/百分比来量化这种相似性。
使用HtmlDiff统计:
这个类可用于创建 HTML 表格(或包含表格的完整 HTML 文件)以并排地逐行显示文本比较,行间与行外的更改将突出显示。
我们先实例化一个difflib.HtmlDiff
对象,任何调用make_file
方法获取结果写入xx.html
文件即可获取差异。
d = difflib.HtmlDiff() # 创建HtmlDiff对象
htmlContent=d.make_file(file1.readlines(), file2.readlines()) # 通过make_file方法输出html格式的对比结果
with open('diff.html', 'w') as f:
f.write(htmlContent)
目录下会生成一个diff.html文件,打开文件显示:
context_diff
with open("D:\data\\day1.txt",'r',encoding='UTF-8') as file1, open("D:\data\\day2.txt",'r',encoding='UTF-8') as file2:
for diff in difflib.context_diff(file1.readlines(), file2.readlines()):
print(diff)
程序通过调用difflib 库的context_diff函数,一行代码便可以给两个列表进行“找茬”处理。在结果的展示中,可以看到,context_diff函数输出的结果更加的清晰明确,*******1,11*****中,1和11表示的是传入第一个列表中的元素而在第二个列表中不存在。
准确指示元素间的差异
前面的操作还只是简单的筛查出来,不同列表之间元素的区别,difflib 还能够更进一步,直接找到不同元素之间的差异性,如下图所示
with open("D:\data\\day1.txt",'r',encoding='UTF-8') as file1, open("D:\data\\day2.txt",'r',encoding='UTF-8') as file2:
for diff in difflib.ndiff(file1.readlines(), file2.readlines()):
print(diff)
结果输出:
通过ndiff函数来寻找两个列表中,不同英文单词的细节差异,输出结果中 ,-号表示的是在第一个列表中存在,但是在第二个列表中没有的元素,+号表示在第一个列表中不存在,但是在第二个列表中存在的元素。对比peak和peek,可以发现,第三个元素是不相同的,因此在结果中通过^号来指出存在差异的字母位置。
以上就是本次的全部内容了,希望对大家在文件内容对比上有所启发。
关于difflib
更多的介绍大家可以参考官方文档:
https://docs.python.org/zh-cn/3/library/difflib.html
简书是为了记录学习的一个状态,希望大家也在这条道路上越来越棒,新建了一个学习平台,分享一些python学习和考公笔记
每天都有新朋友加入,感觉大家的信任,有新的想法的朋友,可以关注,一起探讨!