文件内容差异对比方法
两个字符串的差异对比
本示例通过使用difflib模块实现两个字符串的差异对比,然后以版本控制风格(类似于SVN比较差异的样子)进行输出
import difflib
test1 = "test1xxxxxx"
test1_lines = test1.splitlines()
test2 = "test2xxxxxx"
test2_lines = test2.splitlines()
# 创建Differ对象
d = difflib.Differ()
# 使用compare方法对字符串进行比较
diff = d.compare(test1_lines,test2_lines)
print("\n".join(list(diff))) # "\n".join 以换行来看
#-------------------------------------------------------------
打印结果:
- test1xxxxxx
? ^
+ test2xxxxxx
? ^
符号含义说明:
符号 | 含义 |
---|---|
'_' | 包含在第一行序列行中,但不包含在第二行序列行 |
'+' | 包含在第二行序列行中,但不包含在第一行序列行 |
'' | 两个序列行一致 |
'?' | 标志两个序列行存在增量差异 |
'^' | 标志出两个序列行存在的差异字符 |
生成美观的对比HTML格式文档
采用HtmlDIFF() 类的 make_file() 方法就可以生成美观的HTML文档
import difflib
test1 = "test1xxxxxx"
test1_lines = test1.splitlines()
test2 = "test2xxxxxx"
test2_lines = test2.splitlines()
# 创建HtmlDiff对象
d = difflib.HtmlDiff()
print(d.make_file(test1_lines,test2_lines))
运行这个文件,如果在pycharm中执行会输出html源代码,我们用命令行模块输出到一个html格式的文件
[root@192.168.32.130 /python/python_自动化运维]$ python3 difflib_使用.py > diff.html
在浏览器中查看:黄色表示差异的地方
对比Nginx配置文件差异
概要
当我们维护多个Nginx配置时,时常会对比不同版本配置文件的差异,使运维人员更加清晰的了解不同版本迭代更新后的内容
实现的思路 是 读取两个需要对比的配置文件,再以换行符作为分隔符,调用difflb.HtmlDIff()生成html格式的差异文档
代码实现
import difflib
import sys
try:
file1 = sys.argv[1] # 接收用户传入的文件参数
file2 = sys.argv[2]
except Exception as e:
print(e)
sys.exit()
def readline(filename): # 定义读取文件函数
try:
with open(filename,"rt",encoding="utf-8") as f:
text = f.read().splitlines()
return text # 获取文件内容
except Exception as e:
print(e)
sys.exit()
if file1 == "" or file2 == "": # 严谨性判断
print("usage:python3 xxx.py file1 file2")
sys.exit()
f1 = readline(file1) # 调用读取文件函数
f2 = readline(file2)
d = difflib.HtmlDiff() # 创建对象
print(d.make_file(f1,f2)) # 使用make_file方法输出html格式的对比结果
[root@192.168.32.130 /python/python_自动化运维]$ python3 difflib_使用.py nginx.conf.v1 nginx.conf.v2 > diff2.html
运行结果
类似于svn版本控制文件对比样子