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正则匹配查询港澳通行证办理进度示例分享
Dec 27 Python
理解python多线程(python多线程简明教程)
Jun 09 Python
Python语言的12个基础知识点小结
Jul 10 Python
跟老齐学Python之重回函数
Oct 10 Python
Python备份目录及目录下的全部内容的实现方法
Jun 12 Python
python3.5实现socket通讯示例(TCP)
Feb 07 Python
Python实现曲线点抽稀算法的示例
Oct 12 Python
使用Selenium破解新浪微博的四宫格验证码
Oct 19 Python
python2.7使用plotly绘制本地散点图和折线图
Apr 02 Python
Pandas之排序函数sort_values()的实现
Jul 09 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
Dec 13 Python
Pandas读取csv时如何设置列名
Jun 02 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
PHPMYADMIN 简明安装教程 推荐
2010/03/07 PHP
php使用str_replace实现输入框回车替换br的方法
2014/11/24 PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
2019/12/13 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
容易被忽略的JS脚本特性
2011/09/13 Javascript
jQuery UI Dialog 创建友好的弹出对话框实现代码
2012/04/12 Javascript
基于jQuery的input输入框下拉提示层(自动邮箱后缀名)
2012/06/14 Javascript
分享10个原生JavaScript技巧
2015/04/20 Javascript
jQuery中next方法用法实例
2015/04/24 Javascript
深入解析JavaScript编程中的this关键字使用
2015/11/09 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
深入理解JS继承和原型链的问题
2016/12/17 Javascript
javascript操作cookie
2017/01/17 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
2017/03/16 Javascript
Nodejs使用Mongodb存储与提供后端CRD服务详解
2018/09/04 NodeJs
详解js动态获取浏览器或页面等容器的宽高
2019/03/13 Javascript
js滚轮事件 js自定义滚动条的实现
2020/01/18 Javascript
uni-app从安装到卸载的入门教程
2020/05/15 Javascript
Python语言技巧之三元运算符使用介绍
2013/03/04 Python
深入理解Python中命名空间的查找规则LEGB
2015/08/06 Python
对Python捕获控制台输出流的方法详解
2019/01/07 Python
Python中dict和set的用法讲解
2019/03/28 Python
python3常用的数据清洗方法(小结)
2019/10/31 Python
Python3 main函数使用sys.argv传入多个参数的实现
2019/12/25 Python
CSS3 实现侧边栏展开收起动画
2014/12/22 HTML / CSS
Lookfantastic香港官网:英国知名美妆购物网站
2018/06/19 全球购物
新西兰航空中国官网:Air New Zealand China
2018/07/24 全球购物
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
护士自我鉴定
2013/10/23 职场文书
会计岗位职责模板
2014/03/12 职场文书
爱祖国爱家乡演讲稿
2014/09/02 职场文书
个人学习总结范文
2015/02/15 职场文书
创业计划书之面包店
2019/09/12 职场文书
比较node.js和Deno
2021/04/27 Javascript
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python