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兔子毒药问题实例分析
Mar 05 Python
pygame学习笔记(3):运动速率、时间、事件、文字
Apr 15 Python
浅谈Python基础之I/O模型
May 11 Python
MySQL适配器PyMySQL详解
Sep 20 Python
pandas基于时间序列的固定时间间隔求均值的方法
Jul 04 Python
django之静态文件 django 2.0 在网页中显示图片的例子
Jul 28 Python
python matplotlib库绘制条形图练习题
Aug 10 Python
TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现
Feb 17 Python
Python单链表原理与实现方法详解
Feb 22 Python
记录模型训练时loss值的变化情况
Jun 16 Python
Django Model层F,Q对象和聚合函数原理解析
Nov 12 Python
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
Jun 09 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字符串的递增和递减示例介绍
2014/02/11 PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
2016/03/07 PHP
Javascript 兼容firefox的一些问题
2009/05/21 Javascript
JavaScript null和undefined区别分析
2009/10/14 Javascript
JQuery文本框高亮显示插件代码
2011/04/02 Javascript
Javascript代码在页面加载时的执行顺序介绍
2013/05/03 Javascript
jQuery.holdReady()使用方法
2014/05/20 Javascript
简单的JS时钟实例讲解
2016/01/13 Javascript
JavaScript数组实现数据结构中的队列与堆栈
2016/05/26 Javascript
利用jQuery对无序列表排序的简单方法
2016/10/16 Javascript
JavaScript仿微信打飞机游戏
2020/07/05 Javascript
Javascript中toFixed计算错误(依赖银行家舍入法的缺陷)解决方法
2017/08/22 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
2018/04/21 Javascript
vue axios数据请求get、post方法及实例详解
2018/09/11 Javascript
深入浅出了解Node.js Streams
2019/05/27 Javascript
vue 地区选择器v-distpicker的常用功能
2019/07/23 Javascript
js实现带积分弹球小游戏
2020/07/21 Javascript
Vue在H5 项目中使用融云进行实时个人单聊通讯
2020/12/14 Vue.js
python脚本作为Windows服务启动代码详解
2018/02/11 Python
python 去除txt文本中的空格、数字、特定字母等方法
2018/07/24 Python
selenium3+python3环境搭建教程图解
2018/12/07 Python
Python基于百度云文字识别API
2018/12/13 Python
Python 调用 zabbix api的方法示例
2019/01/06 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
2019/01/08 Python
用Python+OpenCV对比图像质量的几种方法
2019/07/15 Python
python zip()函数使用方法解析
2019/10/31 Python
浅谈pytorch池化maxpool2D注意事项
2020/02/18 Python
北美三大旅游网站之一:Travelocity加拿大
2016/08/20 全球购物
Under Armour安德玛德国官网:美国高端运动科技品牌
2019/03/09 全球购物
出纳岗位职责范本
2013/12/01 职场文书
制衣厂各岗位职责
2013/12/02 职场文书
毕业生自荐书
2014/02/03 职场文书
餐厅楼面部长岗位职责范文
2014/02/16 职场文书
三分钟自我介绍演讲稿
2014/08/21 职场文书
2014年党员自我评议对照检查材料
2014/09/20 职场文书
CSS实现渐变色边框(Gradient borders)的5种方法
2022/03/25 HTML / CSS