Python|文件内容对比模块difflib

'''
随着数据量不断增加,文本处理成为了日常工作中不可或缺的一部分。如word发送给其他人,想查看差异,表格与前一日的不同处,如果每次都需要手动比对数据的差异,那么效率无疑是非常低下的,这时候就需要用到difflib模块。

image.png

** difflib为python的标准库模块,无需安装。**

作用:对比文本之间的差异。

并且支持输出可读性比较强的HTML文档,与Linux下的diff 命令相似。

由difflib执行比较,比较的结果放到了一个html里面,只要找个浏览器打开此html文件,就能直观地看到比较结果,两份文件有差异的地方会高亮显示出来。在版本控制方面非常有用。

本文将介绍如何使用difflib类库进行文本比较,包括以下主题:

  1. 模块介绍

  2. 使用difflib进行基于行的文本比较

  3. 使用difflib进行基于字符的文本比较

  4. 输出比较结果

difflib是Python中的一个标准类库,用于比较文本文件或字符串之间的差异。它实现了多种比较算法,包括基于行的比较和基于字符的比较,并提供了多种输出格式。

该模块主要包含以下几个类和函数:Differ:比对两个文本文件的差异,并返回差异的文本。
ndiff:用于比较两个序列(通常是字符串或列表)并显示它们之间的差异。HtmlDiff:比对两个文本文件的差异,并以HTML格式返回差异的文本。SequenceMatcher:比对两个序列(可以是字符串、列表、元组等)的差异,并返回差异的详细信息。
unified_diff:用于比对两个文本文件的差异,并以Unix diff的格式返回差异的文本。以上内容是我们使用difflib模块最常用的内容。

我们拿两日的微博热榜为例,进行比较

image.png

比较文件的差异,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))

结果:


image.png

比较文件的差异,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 增量的每一行均以双字母代码打头:


image.png

**查看相似度 **

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文件,打开文件显示:

image.png

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)

结果输出:

image.png

通过ndiff函数来寻找两个列表中,不同英文单词的细节差异,输出结果中 ,-号表示的是在第一个列表中存在,但是在第二个列表中没有的元素,+号表示在第一个列表中不存在,但是在第二个列表中存在的元素。对比peak和peek,可以发现,第三个元素是不相同的,因此在结果中通过^号来指出存在差异的字母位置。

以上就是本次的全部内容了,希望对大家在文件内容对比上有所启发。

关于difflib更多的介绍大家可以参考官方文档:

https://docs.python.org/zh-cn/3/library/difflib.html

简书是为了记录学习的一个状态,希望大家也在这条道路上越来越棒,新建了一个学习平台,分享一些python学习和考公笔记

image

每天都有新朋友加入,感觉大家的信任,有新的想法的朋友,可以关注,一起探讨!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容