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 中的list和array的不同之处及转换问题
Mar 13 Python
Python使用gRPC传输协议教程
Oct 16 Python
python flask安装和命令详解
Apr 02 Python
python 梯度法求解函数极值的实例
Jul 10 Python
python代码实现逻辑回归logistic原理
Aug 07 Python
pytorch使用 to 进行类型转换方式
Jan 08 Python
Python JSON编解码方式原理详解
Jan 20 Python
解决python执行较大excel文件openpyxl慢问题
May 15 Python
python如何快速拼接字符串
Oct 28 Python
Django实现简单的分页功能
Feb 22 Python
python通过opencv调用摄像头操作实例分析
Jun 07 Python
详解在OpenCV中如何使用图像像素
Mar 03 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 文件上传代码(限制jpg文件)
2010/01/05 PHP
PHP无刷新上传文件实现代码
2011/09/19 PHP
eclipse php wamp配置教程
2016/06/30 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
JavaScript使用prototype定义对象类型
2007/02/07 Javascript
ie6下png图片背景不透明的解决办法使用js实现
2013/01/11 Javascript
js循环改变div颜色具体方法
2013/06/25 Javascript
jQuery响应enter键的实现思路
2014/04/18 Javascript
一段非常简单的js判断浏览器的内核
2014/08/17 Javascript
JavaScript AOP编程实例
2015/06/16 Javascript
理解jquery事件冒泡
2016/01/03 Javascript
实例解析jQuery中proxy()函数的用法
2016/05/24 Javascript
用原生js统计文本行数的简单示例
2016/08/19 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
浅谈javascript中执行环境(作用域)与作用域链
2016/12/08 Javascript
关于JS Lodop打印插件打印Bootstrap样式错乱问题的解决方案
2016/12/23 Javascript
JS实现HTML标签转义及反转义
2020/04/14 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
2017/08/22 Javascript
页面点击小红心js实现代码
2018/05/26 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
vue搜索页开发实例代码详解(热门搜索,历史搜索,淘宝接口演示)
2020/04/11 Javascript
javascript利用canvas实现鼠标拖拽功能
2020/07/23 Javascript
[48:24]完美世界DOTA2联赛循环赛LBZS vs Forest 第一场 10月30日
2020/10/31 DOTA
[54:18]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第一场 1月22日
2021/03/11 DOTA
Python中集合的内建函数和内建方法学习教程
2015/08/19 Python
pycharm安装图文教程
2017/05/02 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
2018/04/05 Python
Python解决走迷宫问题算法示例
2018/07/27 Python
对python numpy.array插入一行或一列的方法详解
2019/01/29 Python
修改 CentOS 6.x 上默认Python的方法
2019/09/06 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
2020/02/17 Python
介绍一下except的用法和作用
2015/01/22 面试题
中文专业求职信
2014/06/20 职场文书
慰问信格式
2015/02/14 职场文书
小学生运动会广播
2015/08/19 职场文书
幼儿园家长心得体会
2016/01/21 职场文书