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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容