加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python difflib模块示例讲解

发布时间:2020-12-17 08:04:54 所属栏目:Python 来源:网络整理
导读:difflib模块提供的类和方法用来进行序列的差异化比较,它能够比对文件并生成差异结果文本或者html格式的差异化比较页面,如果需要比较目录的不同,可以使用filecmp模块。 class difflib.SequenceMatcher 此类提供了比较任意可哈希类型序列对方法。此方法将寻

difflib模块提供的类和方法用来进行序列的差异化比较,它能够比对文件并生成差异结果文本或者html格式的差异化比较页面,如果需要比较目录的不同,可以使用filecmp模块。

class difflib.SequenceMatcher

此类提供了比较任意可哈希类型序列对方法。此方法将寻找没有包含‘垃圾'元素的最大连续匹配序列。

通过对算法的复杂度比较,它由于原始的完形匹配算法,在最坏情况下有n的平方次运算,在最好情况下,具有线性的效率。

它具有自动垃圾启发式,可以将重复超过片段1%或者重复200次的字符作为垃圾来处理。可以通过将autojunk设置为false关闭该功能。

class difflib.Differ

此类比较的是文本行的差异并且产生适合人类阅读的差异结果或者增量结果,结果中各部分的表示如下:

class difflib.HtmlDiff

 此类可以被用来创建HTML表格 (或者说包含表格的html文件) ,两边对应展示或者行对行的展示比对差异结果。

 make_file(fromlines,tolines [,fromdesc][,todesc][,context][,numlines])

make_table(fromlines,numlines])

以上两个方法都可以用来生成包含一个内容为比对结果的表格的html文件,并且部分内容会高亮显示。

difflib.context_diff(a,b[,fromfile][,tofile][,fromfiledate][,tofiledate][,n][,lineterm])

比较a与b(字符串列表),并且返回一个差异文本行的生成器
示例:

>>> s1 = ['baconn','eggsn','hamn','guidon']
>>> s2 = ['pythonn','eggyn','hamstern','guidon']
>>> 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[,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,linejunk][,charjunk])

比较a与b(字符串列表),返回一个Differ-style 的差异结果
示例:

>>> diff = ndiff('onentwonthreen'.splitlines(1),...       'orentreenemun'.splitlines(1))
>>> print ''.join(diff),- one
? ^
+ ore
? ^
- two
- three
? -
+ tree
+ emu

difflib.restore(sequence,which)

返回一个由两个比对序列产生的结果

示例

>>> diff = ndiff('onentwonthreen'.splitlines(1),...       'orentreenemun'.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,lineterm])

比较a与b(字符串列表),返回一个unified diff格式的差异结果.

示例:

>>> s1 = ['baconn','guidon']
>>> for line in unified_diff(s1,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()

运行结果:

生成的html文件比对结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读