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列表推导式的使用方法
Nov 21 Python
Python中遍历字典过程中更改元素导致异常的解决方法
May 12 Python
python下setuptools的安装详解及No module named setuptools的解决方法
Jul 06 Python
python实现感知器算法详解
Dec 19 Python
Python设置在shell脚本中自动补全功能的方法
Jun 25 Python
python3解析库lxml的安装与基本使用
Jun 27 Python
Python socket实现的简单通信功能示例
Aug 21 Python
Pytorch实现神经网络的分类方式
Jan 08 Python
Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法
Feb 27 Python
如何在sublime编辑器中安装python
May 20 Python
Python configparser模块操作代码实例
Jun 08 Python
python实现PolynomialFeatures多项式的方法
Jan 06 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添加MySQL数据记录代码
2008/06/07 PHP
PHP程序员基本要求和必备技能
2014/05/09 PHP
在php7中MongoDB实现模糊查询的方法详解
2017/05/03 PHP
Yii框架使用魔术方法实现跨文件调用功能示例
2017/05/20 PHP
用jQuery简化JavaScript开发分析
2009/02/19 Javascript
javascript算法学习(直接插入排序)
2011/04/12 Javascript
jQuery解决下拉框select设宽度时IE 6/7/8下option超出显示不全
2013/05/27 Javascript
JavaScript获取table中某一列的值的方法
2014/05/06 Javascript
js防止DIV布局滚动时闪动的解决方法
2014/10/30 Javascript
JavaScript获取当前url根目录(路径)
2016/06/17 Javascript
Google 地图控件集详解及实例代码
2016/08/06 Javascript
如何处理JSON中的特殊字符
2016/11/30 Javascript
基于vue2.0+vuex的日期选择组件功能实现
2017/03/13 Javascript
vue 自定义全局方法,在组件里面的使用介绍
2018/02/28 Javascript
ES6入门教程之Array.from()方法
2019/03/23 Javascript
vue 中 elment-ui table合并上下两行相同数据单元格
2019/12/26 Javascript
[03:12]完美世界DOTA2联赛PWL DAY6集锦
2020/11/05 DOTA
简单介绍Python2.x版本中的cmp()方法的使用
2015/05/20 Python
python读取txt文件并取其某一列数据的示例
2019/02/19 Python
python实现微信每日一句自动发送给喜欢的人
2019/04/29 Python
Python 实现文件读写、坐标寻址、查找替换功能
2019/09/11 Python
python多线程高级锁condition简单用法示例
2019/11/07 Python
Python+OpenCV实现旋转文本校正方式
2020/01/09 Python
Python异常处理机制结构实例解析
2020/07/23 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
2020/10/15 Python
python 批量将中文名转换为拼音
2021/02/07 Python
欧洲最大的化妆品连锁公司:Douglas道格拉斯
2017/05/06 全球购物
新加坡最早生产电动滑板车的制造商之一:FunsToTheFore
2020/09/08 全球购物
初中考试作弊检讨书
2014/02/01 职场文书
幼儿教师国培感言
2014/02/19 职场文书
人力资源管理专业求职信
2014/07/23 职场文书
铅球加油稿100字
2014/09/26 职场文书
自主招生推荐信怎么写
2015/03/26 职场文书
慈善献爱心倡议书
2015/04/27 职场文书
幼儿园托班教育随笔
2015/08/14 职场文书
Vue vee-validate插件的简单使用
2021/06/22 Vue.js