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中非常实用的一些功能和函数分享
Feb 14 Python
TensorFlow安装及jupyter notebook配置方法
Sep 08 Python
numpy.random模块用法总结
May 27 Python
如何用Python做一个微信机器人自动拉群
Jul 03 Python
python for循环remove同一个list过程解析
Aug 14 Python
Python中PyQt5/PySide2的按钮控件使用实例
Aug 17 Python
python range实例用法分享
Feb 06 Python
基于python实现简单网页服务器代码实例
Sep 14 Python
Python 找出英文单词列表(list)中最长单词链
Dec 14 Python
Python手拉手教你爬取贝壳房源数据的实战教程
May 21 Python
详解运行Python的神器Jupyter Notebook
Jun 03 Python
Matplotlib可视化之添加让统计图变得简单易懂的注释
Jun 11 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中call_user_func_array()函数的用法演示
2012/02/05 PHP
php检测url是否存在的方法
2015/04/14 PHP
thinkPHP简单实现多个子查询语句的方法
2016/12/05 PHP
用脚本调用样式的几种方法
2006/12/09 Javascript
JS 中document.URL 和 windows.location.href 的区别
2009/11/11 Javascript
js function定义函数使用心得
2010/04/15 Javascript
无刷新上传文件并返回自定义值
2015/06/11 Javascript
详解JavaScript函数对象
2015/11/15 Javascript
分享Javascript实用方法二
2015/12/13 Javascript
老生常谈js动态添加事件--- 事件委托
2016/07/19 Javascript
CSS3 media queries结合jQuery实现响应式导航
2016/09/30 Javascript
jQuery实现的简单拖动层示例
2017/02/22 Javascript
VUE开发一个图片轮播的组件示例代码
2017/03/06 Javascript
单行 JS 实现移动端金钱格式的输入规则
2017/05/22 Javascript
jQuery实现文件编码成base64并通过AJAX上传的方法
2018/04/12 jQuery
使用vue-cli创建项目的图文教程(新手入门篇)
2018/05/02 Javascript
vue watch深度监听对象实现数据联动效果
2018/08/16 Javascript
python3 破解 geetest(极验)的滑块验证码功能
2018/02/24 Python
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
2018/03/19 Python
Python实现简单的文本相似度分析操作详解
2018/06/16 Python
对tensorflow 的模型保存和调用实例讲解
2018/07/28 Python
python如何实现视频转代码视频
2019/06/17 Python
Django框架模板用法入门教程
2019/11/04 Python
python 创建一维的0向量实例
2019/12/02 Python
python中用ggplot绘制画图实例讲解
2021/01/26 Python
采用专利算法搜索最廉价的机票:CheapAir
2016/09/10 全球购物
Expedia爱尔兰:酒店、机票、租车及廉价假期
2017/01/02 全球购物
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
《庐山的云雾》教学反思
2014/04/22 职场文书
小学生竞选班长演讲稿
2014/04/24 职场文书
2014年食堂工作总结
2014/11/20 职场文书
幼儿园毕业典礼家长致辞
2015/07/29 职场文书
奖学金申请书(范文)
2019/08/14 职场文书
利用javaScript处理常用事件详解
2021/04/14 Javascript
Python如何解决secure_filename对中文不支持问题
2021/07/16 Python
Java中Quartz高可用定时任务快速入门
2022/04/03 Java/Android