运行环境:
Python3.6
,Windwos10 RS1
,Pycharm
模块介绍
我们可以通过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!
和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
标记语言,运行结果如下:
我们这样子无法对比出文本的差异,所以我们切换到Terminal
终端,通过重定向符(不知道在Windows
环境中这样说是否准确)将产生的html
存下来。
我们在终端中运行刚才的代码,我们可以看到生成了Text.html
文件。
python Difflib.py > Text.html
我们使用浏览器打开Text.html
文件,会发现一个新的问题出来了,我们使用网页打开我们输出的Text.html
文件,显示效果如下,换了多个浏览器也是一致乱码。
我们会发现只要是显示中文,包括中文和中文输入法的字符都会出现乱码。所以我查看了一下Text.html
文本,首先是检查的编码格式为utf-8
,utf-8
编码本身就是为融合世界字符语言推出的,所以utf-8
编码对中文字符的支持自然是满足的,值得一提的是Python3
的推出将缺省编码改为utf-8
了。
我们将utf-8
编码改为同样支持中文编码的gbk
后,重新使用浏览器打开Text.html
文件发现中文显示正常。这样的HTML
文档包括了行号、差异标志、图例等信息,可读性增强了很多。
因为是菜鸟,诸多不懂,所以如果读者有知道该Python重定向输出编码出现乱码的原因或者解决办法,请在评论区留言,感激不尽。