您的位置:首页 > 编程语言 > Python开发

Python自动化运维笔记(四):使用difflib模块实现文件内容差异对比

2017-10-02 00:29 721 查看
运行环境:
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

bd81
档。

我们依旧采用上面的代码,做一些简单的修改:

# -*- 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重定向输出编码出现乱码的原因或者解决办法,请在评论区留言,感激不尽。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: