python—difflib内置模块之文本对比

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值