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学习笔记:字典的使用示例详解
Jun 13 Python
python用pickle模块实现“增删改查”的简易功能
Jun 07 Python
Python 实现简单的shell sed替换功能(实例讲解)
Sep 29 Python
python 重命名轴索引的方法
Nov 10 Python
在Python中获取两数相除的商和余数方法
Nov 10 Python
python 实现语音聊天机器人的示例代码
Dec 02 Python
Python GUI编程完整示例
Apr 04 Python
从0开始的Python学习016异常
Apr 08 Python
Python命名空间namespace及作用域原理解析
Jun 05 Python
python numpy实现rolling滚动案例
Jun 08 Python
树莓派升级python的具体步骤
Jul 05 Python
pandas时间序列之pd.to_datetime()的实现
Jun 16 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
php下实现折线图效果的代码
2007/04/28 PHP
安装ImageMagick出现error while loading shared libraries的解决方法
2014/09/23 PHP
13个绚丽的Jquery 界面设计网站推荐
2010/09/28 Javascript
jquery鼠标停止移动事件
2013/12/21 Javascript
Javascript 实现图片无缝滚动
2014/12/19 Javascript
JSON格式的键盘编码对照表
2015/01/29 Javascript
jquery马赛克拼接翻转效果代码分享
2015/08/24 Javascript
jquery.cookie.js用法实例详解
2015/12/25 Javascript
常用的js验证和数据处理总结
2016/08/02 Javascript
js中创建对象的几种方式
2017/02/05 Javascript
AngularJS之自定义服务详解(factory、service、provider)
2017/04/14 Javascript
vue组件与复用详解
2018/04/08 Javascript
详解vue几种主动刷新的方法总结
2019/02/19 Javascript
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
Javascript数组方法reduce的妙用之处分享
2019/06/10 Javascript
VueCli3.0中集成MockApi的方法示例
2019/07/05 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
2019/09/18 Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
2019/12/20 Javascript
Vue使用Ref跨层级获取组件的步骤
2021/01/25 Vue.js
[03:27]《辉夜杯》线下训练营 导师CU和海涛指点迷津
2015/10/23 DOTA
对numpy中shape的深入理解
2018/06/15 Python
Python关于excel和shp的使用在matplotlib
2019/01/03 Python
python-OpenCV 实现将数组转换成灰度图和彩图
2020/01/09 Python
Python爬虫代理池搭建的方法步骤
2020/09/28 Python
CSS3控制HTML元素动画效果
2014/02/08 HTML / CSS
把富文本的回车转为br标签
2019/08/09 HTML / CSS
维也纳通行证:Vienna PASS
2019/07/18 全球购物
大学生活学习的自我评价
2013/12/03 职场文书
技术总监个人的自我评价范文
2013/12/18 职场文书
会计专业自我评价
2014/02/12 职场文书
夫妻分居协议书范文
2014/11/26 职场文书
2015年清明节网上祭英烈留言寄语
2015/03/04 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
幼儿园小班教师随笔
2015/08/14 职场文书
MySQL表字段时间设置默认值
2021/05/13 MySQL
postgresql之greenplum字符串去重拼接方式
2023/05/08 PostgreSQL