python difflib模块示例讲解


Posted in Python onSeptember 13, 2017

difflib模块提供的类和方法用来进行序列的差异化比较,它能够比对文件并生成差异结果文本或者html格式的差异化比较页面,如果需要比较目录的不同,可以使用filecmp模块。

class difflib.SequenceMatcher

此类提供了比较任意可哈希类型序列对方法。此方法将寻找没有包含‘垃圾'元素的最大连续匹配序列。

通过对算法的复杂度比较,它由于原始的完形匹配算法,在最坏情况下有n的平方次运算,在最好情况下,具有线性的效率。

它具有自动垃圾启发式,可以将重复超过片段1%或者重复200次的字符作为垃圾来处理。可以通过将autojunk设置为false关闭该功能。

class difflib.Differ

此类比较的是文本行的差异并且产生适合人类阅读的差异结果或者增量结果,结果中各部分的表示如下:

python difflib模块示例讲解

class difflib.HtmlDiff

 此类可以被用来创建HTML表格 (或者说包含表格的html文件) ,两边对应展示或者行对行的展示比对差异结果。

 make_file(fromlines, tolines [, fromdesc][, todesc][, context][, numlines])

make_table(fromlines, tolines [, fromdesc][, todesc][, context][, numlines])

以上两个方法都可以用来生成包含一个内容为比对结果的表格的html文件,并且部分内容会高亮显示。

difflib.context_diff(a, b[, fromfile][, tofile][, fromfiledate][, tofiledate][, n][, lineterm])

比较a与b(字符串列表),并且返回一个差异文本行的生成器
示例:

>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
>>> for line in context_diff(s1, s2, fromfile='before.py', tofile='after.py'):
...   sys.stdout.write(line) 
*** before.py
--- after.py
***************
*** 1,4 ****
! bacon
! eggs
! ham
 guido
--- 1,4 ----
! python
! eggy
! hamster
 guido

difflib.get_close_matches(word, possibilities[, n][, cutoff])

返回最大匹配结果的列表

示例:

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('apple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']

difflib.ndiff(a, b[, linejunk][, charjunk])

比较a与b(字符串列表),返回一个Differ-style 的差异结果
示例:

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(1),
...       'ore\ntree\nemu\n'.splitlines(1))
>>> print ''.join(diff),
- one
? ^
+ ore
? ^
- two
- three
? -
+ tree
+ emu

difflib.restore(sequence, which)

返回一个由两个比对序列产生的结果

示例

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(1),
...       'ore\ntree\nemu\n'.splitlines(1))
>>> diff = list(diff) # materialize the generated delta into a list
>>> print ''.join(restore(diff, 1)),
one
two
three
>>> print ''.join(restore(diff, 2)),
ore
tree
emu

difflib.unified_diff(a, b[, fromfile][, tofile][, fromfiledate][, tofiledate][, n][, lineterm])

比较a与b(字符串列表),返回一个unified diff格式的差异结果.

示例:

>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
>>> for line in unified_diff(s1, s2, fromfile='before.py', tofile='after.py'):
...  sys.stdout.write(line) 
--- before.py
+++ after.py
@@ -1,4 +1,4 @@
-bacon
-eggs
-ham
+python
+eggy
+hamster
 guido

实际应用示例

比对两个文件,然后生成一个展示差异结果的HTML文件

#coding:utf-8
'''
file:difflibeg.py
date:2017/9/9 10:33
author:lockey
email:lockey@123.com
desc:diffle module learning and practising 
'''
import difflib
hd = difflib.HtmlDiff()
loads = ''
with open('G:/python/note/day09/0907code/hostinfo/cpu.py','r') as load:
 loads = load.readlines()
 load.close()

mems = ''
with open('G:/python/note/day09/0907code/hostinfo/mem.py', 'r') as mem:
 mems = mem.readlines()
 mem.close()

with open('htmlout.html','a+') as fo:
 fo.write(hd.make_file(loads,mems))
 fo.close()

运行结果:

python difflib模块示例讲解

生成的html文件比对结果:

python difflib模块示例讲解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python生成随机mac地址的方法
Mar 16 Python
解决uWSGI的编码问题详解
Mar 24 Python
python机器学习之神经网络(一)
Dec 20 Python
python对离散变量的one-hot编码方法
Jul 11 Python
VSCode Python开发环境配置的详细步骤
Feb 22 Python
python 对字典按照value进行排序的方法
May 09 Python
python频繁写入文件时提速的方法
Jun 26 Python
Python3.8对可迭代解包的改进及用法详解
Oct 15 Python
python中property和setter装饰器用法
Dec 19 Python
PyTorch中的C++扩展实现
Apr 02 Python
Python RabbitMQ实现简单的进程间通信示例
Jul 02 Python
Python wordcloud库安装方法总结
Dec 31 Python
Python网络编程 Python套接字编程
Sep 13 #Python
python和ruby,我选谁?
Sep 13 #Python
python实现简单点对点(p2p)聊天
Sep 13 #Python
django 常用orm操作详解
Sep 13 #Python
Python三级菜单的实例
Sep 13 #Python
基于Python代码编辑器的选用(详解)
Sep 13 #Python
python多线程socket编程之多客户端接入
Sep 12 #Python
You might like
关于使用key/value数据库redis和TTSERVER的心得体会
2013/06/28 PHP
PHP中Fatal error session_start()错误解决步骤
2014/08/05 PHP
php之curl实现http与https请求的方法
2014/10/21 PHP
php中$_POST与php://input的区别实例分析
2015/01/07 PHP
用php实现分页效果的示例代码
2020/12/10 PHP
extjs grid取到数据而不显示的解决
2008/12/29 Javascript
js点击选择文本的方法
2015/02/09 Javascript
JS实现让网页背景图片斜向移动的方法
2015/02/25 Javascript
js字符串操作方法实例分析
2015/05/06 Javascript
js实现精美的图片跟随鼠标效果实例
2015/05/16 Javascript
有关jQuery中parent()和siblings()的小问题
2016/06/01 Javascript
前端框架Vue.js构建大型应用浅析
2016/09/12 Javascript
bootstrap PrintThis打印插件使用详解
2017/02/20 Javascript
AngularJS使用ng-class动态增减class样式的方法示例
2017/05/18 Javascript
利用jsonp与代理服务器方案解决跨域问题
2017/09/14 Javascript
小程序红包雨的实现示例
2019/02/19 Javascript
Vue 自定义标签的src属性不能使用相对路径的解决
2019/09/17 Javascript
JS实现4位随机验证码
2020/10/19 Javascript
vue-cli4使用全局less文件中的变量配置操作
2020/10/21 Javascript
vue组件中传值EventBus的使用及注意事项说明
2020/11/16 Javascript
python中管道用法入门实例
2015/06/04 Python
浅谈numpy数组中冒号和负号的含义
2018/04/18 Python
Python之修改图片像素值的方法
2019/07/03 Python
python数据归一化及三种方法详解
2019/08/06 Python
python实现对列表中的元素进行倒序打印
2019/11/23 Python
Pytorch模型转onnx模型实例
2020/01/15 Python
使用卷积神经网络(CNN)做人脸识别的示例代码
2020/03/27 Python
美国专注于健康商品的网站:eVitamins
2017/01/23 全球购物
Linux中如何用命令创建目录
2016/12/02 面试题
机电专业个人自荐信格式模板
2013/09/23 职场文书
高中生物教学反思
2014/02/05 职场文书
乡镇交通安全实施方案
2014/03/29 职场文书
小学生环保标语
2014/06/13 职场文书
先进集体事迹材料范文
2014/12/25 职场文书
如何获取numpy array前N个最大值
2021/05/14 Python
基于Python编写一个监控CPU的应用系统
2022/06/25 Python