difflib模块
difflib为python的标准库模块,无需安装。作用时对比文本之间的差异。并且支持输出可读性比较强的HTML文档,与Linux下的diff 命令相似。
difflib模块提供的类和方法用来进行序列的差异化比较,它能够比对文件并生成差异结果文本或者html格式的差异化比较页面,
1、对比文件生成差异结果文本
生成的差异文本中的符号解释:
符号 | 含义 |
---|---|
‘-’ | 包含在第一个系列行中,但不包含第二个。 |
‘+’ | 包含在第二个系列行中,但不包含第一个。 |
’ ’ | 两个系列行一致 |
‘?’ | 存在增量差异 |
‘^’ | 存在差异字符 |
1 先将文本内容按行分割
f1 = splitlines(keepends=True)
# 将多行文本按行分隔,返回一个列表,保留行尾换行符
f2 = splitlines(keepends=False)
# 将多行文本按行分隔,返回一个列表,不保留行尾换行符
2 生成差异结果文件
import difflib
# 导入模块
diff = difflib.Differ()
# 生成差异对象
result = diff.compare(f1,f2)
# 使用差异对象比较两个文本列表,生成差异结果对象
生成的差异对象不能直接查看,需要转化成列表并连接成文本
示例:
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
f1 = passwd1.splitlines(keepends=True)
f2 = passwd2.splitlines(keepends=True)
diff = difflib.Differ()
result = ''.join(list(diff.compare(f1,f2)))
print(result)
#输出结果:
- root:x:0:0:root:/root:/bin/bash
? -
+ rooter:x:0:0:rooter:/rooter:/bin/bash
? ++ ++ ++
bin:x:1:1:bin:/bin:/sbin/nologin
+ daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
- lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
2 、对比文件生成html格式的差异化比较页面
1 先将文本内容按行分割
2 生成差异结果文件
diff = difflib.HtmlDiff()
#生成差异对象
result = diff.make_file(f1,f2)
# 对比生成差异结果
3 将差异结果写入到html文件中
with open('passwd.html','w')as f:
f.write(result)
示例:
import difflib
passwd1 = '''
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
'''
passwd2 = '''
rooter:x:0:0:rooter:/rooter:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
'''
f1 = passwd1.splitlines(keepends=True)
f2 = passwd2.splitlines(keepends=True)
diff = difflib.HtmlDiff()
result = diff.make_file(f1,f2)
with open('passwd.html','w')as f:
f.write(result)
使用浏览器打开生成的html文件,存在不同的地方会进行高亮显示:
3 、文件之间的对比
首先将文件内容读取出来,然后按照上述方法进行处理即可:
比较 /public/passwd1 和 /public/passwd2 文件存在的差异。并生成 /public/passwd.html 文件。
import difflib
with open('/public/passwd1')as passwd1,open('/public/passwd2')as passwd2:
f1 = passwd1.read().splitlines(keepends=True)
f2 = passwd2.read().splitlines(keepends=True)
diff = difflib.HtmlDiff()
result = diff.make_file(f1,f2)
with open('/public/passwd.html','w')as f:
f.write(result)