什么是difflib?用来做什么?
difflib为python的标准库模块,无需安装。作用是对比文本之间的差异。
并且支持输出可读性比较强的HTML文档,与Linux下的diff 命令相似。
在版本控制方面非常有用。
difflib模块提供的类和方法用来进行序列的差异化比较,他能够比对文件并生成差异结果文本或者html的差异化比较页面
1 对比文件生成差异的文本
生成的差异文本中的符号解释:
| 符号 | 含义 |
|---|---|
| ‘-’ | 包含在第一个系列行中,但不包含第二个 |
| ‘+’ | 包含在第个系列行中,但不包含第一个 |
| ’ ’ | 两个系列行一致 |
| ‘?’ | 存在增量差异 |
| ‘^’ | 存在差异字符 |
示例:
passwd1 :
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
sync❌5:0:sync:/sbin:/bin/sync
passwd2 :
rooter❌0:0:rooter:/rooter:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
sync❌5:0:sync:/sbin:/bin/sync
import difflib
f1 = passwd1.splitlines(keepends=True)
f2 = passwd2.splitlines(keepends=True)
diff = difflib.Differ()
result = ''.join(list(diff.compare(f1,f2)))
print(result)
输出结果
- root❌0:0:root:/root:/bin/bash
+ rooter❌0:0:rooter:/rooter:/bin/bash
? ++ ++ ++
bin❌1:1:bin:/bin:/sbin/nologin
+ daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
- lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
sync❌5:0:sync:/sbin:/bin/sync
将文本内容按行分割
**f1 =splitlines(keepends=False) **将多行文本进行分割处理,返回一个列表,不保留行尾换行符
f2 =splitlines(keepends=True) 将多行文本进行分割处理,返回一个列表,保留换行符
splitlines()按照行分割
返回一个包含各行作为元素的列表
keepends=True 保留换行符
keepends=False 不包含换行符
实现linux可imian类似于diff命令的功能
import difflib # 导入模块
# 列出两个例子
text1 = ''' 1. Beautiful is better than ugly.
2. Explicit is better than implicit.
3. Simple is better than complex.
4. Complex is better than complicated.
'''.splitlines(keepends=False) #不保留换行符
text2 = ''' 1. Beautiful is better than ugly.
3. Simple is better than complex.
4. Complicated is better than complex.
5. Flat is better than nested.
'''.splitlines(keepends=True) # 保留换行符
d =difflib.HtmlDiff()
htmlcontent =d.make_file(text1,text2)
with open('diff.html','w')as f: 生成html文件,通过html文件查看对比 的差异
f.write(htmlcontent)
生成的html文件通过浏览器查看 高亮处就是不同的

linux文件之间的对比
在做此实验之前 先将/etc/passwd 拷贝到/mnt目录下 方便作实验。系统原本自带的文件都不能随意改动
复制到/mnt目录下,复制成两份,对其中一份进行修改,会生成htmldiff文件 可以通过浏览器查看文件的
import difflib
file1 = '/mnt/passwd'
file2 = '/mnt/passwd1'
with open(file1) as f1,open(file2) as f2:
content1 =f1.read().splitlines(keepends=True)
content2 =f2.read().splitlines(keepends=True)
d = difflib.HtmlDiff()
htmlcontent= d.make_file(content1,content2)
with open('passwddiff.html','w') as f :
f.write(htmlcontent)
高亮处查看不同

本文深入探讨了Python标准库中的difflib模块,详细讲解了其用于文本差异比较的功能,包括对比文件生成差异文本和HTML差异页面的方法。通过实例演示了如何使用difflib进行文本对比,生成差异报告,并将其应用到版本控制中。
1万+

被折叠的 条评论
为什么被折叠?



