文件内容差异对比方法

两个字符串的差异对比

本示例通过使用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版本控制文件对比样子

posted @ 2019-10-21 20:01  GeminiMp  阅读(2632)  评论(0编辑  收藏  举报