Python自动化运维笔记(四):使用difflib模块实现文件内容差异对比
2017-10-02 00:29
721 查看
运行环境:
运行结果如下:
在上面的结果中,发现字符串下面有符号标记。其符号含义如下:
然后现在再来分析一下上面的结果。可以得出的是
- 可以实现两个字符串文本的对比,只能是两个
- 两个文本
- 相同的字符串结果中只出现一次,且未有标记
bd81
档。
我们依旧采用上面的代码,做一些简单的修改:
我们单独运行这段代码,会生成
我们这样子无法对比出文本的差异,所以我们切换到
我们在终端中运行刚才的代码,我们可以看到生成了
我们使用浏览器打开
我们会发现只要是显示中文,包括中文和中文输入法的字符都会出现乱码。所以我查看了一下
我们将
因为是菜鸟,诸多不懂,所以如果读者有知道该Python重定向输出编码出现乱码的原因或者解决办法,请在评论区留言,感激不尽。
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重定向输出编码出现乱码的原因或者解决办法,请在评论区留言,感激不尽。
相关文章推荐
- Python自动化运维笔记(五):使用filecmp模块实现文件以及文件目录差异对比
- Python 通过difflib模块实现文件内容差异对比
- python difflib模块实现两个文件差异对比,并输出html格式。
- 使用python实现两个文件夹里文件的对比(包含内容的对比)
- 学习笔记之cocos2d-x2.1.1实现读取.plist文件(使用数组CCArray)
- 使用PYTHON实现如何修改文本文件中的内容
- 使用FileInputStream类, 实现从磁盘读取本应用程序源代码文件,并将文件内容显示在屏幕上。
- Python笔记–IAR使用Python脚本实现自动对烧录文件进行处理
- 分别使用c、shell语言实现文件内容合并 -- 2014百度面试题目
- java学习笔记:使用zip api进行文件解压缩以及不解压直接读取指定文件内容
- 文件内容差异对比
- Java实现CSV文件差异对比
- ITCAST视频-Spring学习笔记(使用Spring配置文件实现AOP)
- 使用随机存取文件流:RandomAccessFile实现文本文件内容的随机插入
- difflib模块对比文件差异
- Linux学习笔记——如何使用echo指令向文件写入内容
- JAVA 文件上传下载笔记之使用基本IO流实现上传
- 任何的File.ReadAllText()和使用StreamReader读取文件内容之间的差异?
- 学习笔记:实现linux下文件内容的复制
- 学习笔记之cocos2d-x2.1.1实现读取.plist文件(使用数组CCArray)