运行环境:Python3.6Windwos10 RS1Pycharm


模块介绍

我们可以通过Python的标准库模块(Python2.3以上就已经自带)difflib模块来实现文件内容的文本差异对比。并且支持输出可读性比较强的HTML文档,与Linux下的diff 命令相似。可以使用difflib对比代码,配置文件的差别,在版本控制方面非常有用。


实现两个字符串的差异对比

在下列示例程序中,我定义了两个字符串,对比差异之后以版本控制风格进行输出。

# -*- coding: utf-8 -*-
# @Time : 2017/10/1 16:22 
# @File : Difflib.py 
# @Software: PyCharm

import difflib

text1 = """ 
This is Text1
人生苦短,我用Python!
Python!Python!Python!
"""

text2 = """ 
This is Text2
人生苦短,我用Python!
Python!Python!Python!
"""
text1_lines = text1.splitlines()    # 分别以行进行分割
text2_lines = text2.splitlines()

d = difflib.Differ()                # 创建Differ对象
diff = d.compare(text1_lines, text2_lines)
print('\n'.join(list(diff)))

运行结果如下:

python diff报告 python中difflib_运维

在上面的结果中,发现字符串下面有符号标记。其符号含义如下:

符号含义’ - ‘包含在第一个系列行中,但不包含第二个。’ + ‘包含在第二个系列行中,但不包含第一个。’ ‘两个序列行一致’ ? ‘标志两个序列行存在增量差异’ ^ ‘标志着两个序列行存在的差异字符

然后现在再来分析一下上面的结果。可以得出的是
- 可以实现两个字符串文本的对比,只能是两个
- 两个文本中Python!Python!中感叹号,分别是用中英输入法输入的,依旧可以被判断出来
- 相同的字符串结果中只出现一次,且未有标记


将字符串对比结果生成美观的HTML格式文档

difflib中的HtmlDiff()类支持将比较结果输出为HTML格式,其HtmlDiff()类中的make_file()方法可以生成美观的html文档。
我们依旧采用上面的代码,做一些简单的修改:

# -*- coding: utf-8 -*-
# @Time : 2017/10/1 16:22
# @File : Difflib.py
# @Software: PyCharm

import difflib

text1 = """ 
This is Text1
人生苦短,我用Python!
Python!Python!Python!
"""

text2 = """ 
This is Text2
人生苦短,我用Python!
Python!Python!Python!
"""
text1_lines = text1.splitlines()  # 分别以行进行分割
text2_lines = text2.splitlines()

# d = difflib.Differ()                # 创建Differ对象
# diff = d.compare(text1_lines, text2_lines)
# print('\n'.join(list(diff)))

d = difflib.HtmlDiff()
print(d.make_file(text1_lines, text2_lines))

我们单独运行这段代码,会生成html标记语言,运行结果如下:

python diff报告 python中difflib_python diff报告_02

我们这样子无法对比出文本的差异,所以我们切换到Terminal终端,通过重定向符(不知道在Windows环境中这样说是否准确)将产生的html存下来。
我们在终端中运行刚才的代码,我们可以看到生成了Text.html文件。

python Difflib.py > Text.html

python diff报告 python中difflib_python diff报告_03

我们使用浏览器打开Text.html文件,会发现一个新的问题出来了,我们使用网页打开我们输出的Text.html文件,显示效果如下,换了多个浏览器也是一致乱码。

python diff报告 python中difflib_python_04

我们会发现只要是显示中文,包括中文和中文输入法的字符都会出现乱码。所以我查看了一下Text.html文本,首先是检查的编码格式为utf-8utf-8编码本身就是为融合世界字符语言推出的,所以utf-8编码对中文字符的支持自然是满足的,值得一提的是Python3的推出将缺省编码改为utf-8了。

python diff报告 python中difflib_字符串_05

我们将utf-8编码改为同样支持中文编码的gbk后,重新使用浏览器打开Text.html文件发现中文显示正常。这样的HTML 文档包括了行号、差异标志、图例等信息,可读性增强了很多。

python diff报告 python中difflib_重定向_06


因为是菜鸟,诸多不懂,所以如果读者有知道该Python重定向输出编码出现乱码的原因或者解决办法,请在评论区留言,感激不尽。