difflib -帮助进行差异化比较

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

class difflib.SequenceMatcher

这是可以用来比较任何类型片段的类,只要比较的片段是可hash的,都可以用来比较,使用非常灵活。他源于1980,s的“完形匹配算法”,并且进行了一系列的优化和改进。

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

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

autojunk 参数新增于2.7.1版本。

class difflib.Differ

这个类用来比较文本里的行,并且产生可阅读的差异化结果。

它用以下符号来表示不同

Code

Meaning

'- '

仅在片段1中存在

'+ '

仅在片段2中存在

' '

片段1和2中都存在

'? '

存在疑问的

标识为?需要你通过人工的方式仔细比较他们的不同,他们产生的原因是源于混乱的制表符

class difflib.HtmlDiff

这个类用来创建一个html表格(或者包含html表格的文件)用来展示文件差异。他既可以进行全文本展示,也可以只展示上下文不同。

这个类的构造函数如下:

__init__(tabsize=8, wrapcolumn=None, linejunk=None, charjunk=IS_CHARACTER_JUNK)

tabsize表示制表符代表的空格个数,默认为8

wrapcolumn,可选参数,用来设置多少个字符时自动换行,默认None,None时表示不自动换行

linejunkcharjunk,可选参数,在ndiff()中使用,

这个类的公共方法:

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

用来生成一个包含表格的html文件,其内容是用来展示差异。

fromlinestolines,用于比较的内容,格式为字符串组成的列表

fromdesctodesc,可选参数,对应的fromlines,tolines的差异化文件的标题,默认为空字符串

contextnumlines,可选参数,context True时,只显示差异的上下文,为false,显示全文,numlines默认为5,当contextTrue时,控制展示上下文的行数,当contextfalse,控制不同差异的高亮之间移动时“next”的开始位置(如果设置为0,当移动懂顶端时,超链接会丢失引用地址)

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

这个方法和make_file用法一样,唯一的区别在于它只生成了一个html表格字符串

python安装包的Tools/scripts/diff.py是关于他们使用的一个很好的例子,它可以用命令行来运行。

新增于python2.4

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

用来比较a,b,a,b都是字符串列表。返回一个格式化文本的差异。

他是一个用来展示少量差异的好方法,这种变化,用前/后的样式进行展示,n默认为3,用来控制展示发现的差异数

默认情况下,差异控制行(*** or ---)用来把a,b的差异区隔开来,便于程序读写处理,如果不需要这样做的话,可以设置lineterm为"",这样,就会卸载一行里

如果格式化差异文本需要标题和修改时间信息,通过fromfile, tofile, fromfiledate, 和 tofiledate进行控制,如果不设置,默认为空

>>> 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])
 返回一个最相似匹配的列表word,用来进行匹配的片段(典型的应用是字符串)
possibilities,用来匹配word的片段
n,默认为3,返回的最多结果数,必须大于0
cutoff,默认为0.6,匹配的相似因数,他是一个介于0,1的浮点数
>>> 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,返回差异

linejunk和charjunk都是用来匹配的方法

linejunk:接收一个字符串的方法,如果这个字符串被认定为垃圾,则返回true,否则为false,默认为None,他调用了IS_LINE_JUNK()这个方法,这个方法存在bug,他不能过滤掉’#’周围的不可见字符,2.3以后,对这个方法进行了动态分析,表现会比以前好些

charjunk:接受一个字符的方法,如果这个字符被认定为垃圾,则返回true,否则为false,它调用了IS_CHARACTER_JUNK(), 他会自动过滤掉空白字符(所以,不要用空白字符或者制表符作为分隔符)

Tools/scripts/ndiff.py 是执行这一方法的实例:

>>> 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)

返回1或2的差异对Differ.compare() 或者 ndiff()的结果进行处理,根据参数which,返回片段1或者片段2的差异化结果实例:

>>> 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,a,b都是字符串列表。返回一个统一的格式化文本的差异。

使用方式和difflib.context_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

difflib.IS_LINE_JUNK(line)如果是需要忽略的行,则返回为true,如果这个行内全为空格或者只有’#’,则将这行忽略掉

difflib.IS_CHARACTER_JUNK(ch)如果是需要忽略的字符,则返回为true,如果这个字符为空格,则将这行忽略掉

python difflib详解的更多相关文章

  1. Python闭包详解

    Python闭包详解 1 快速预览 以下是一段简单的闭包代码示例: def foo(): m=3 n=5 def bar(): a=4 return m+n+a return bar >> ...

  2. [转] Python Traceback详解

    追莫名其妙的bugs利器-mark- 转自:https://www.jianshu.com/p/a8cb5375171a   Python Traceback详解   刚接触Python的时候,简单的 ...

  3. python 数据类型详解

    python数据类型详解 参考网址:http://www.cnblogs.com/linjiqin/p/3608541.html 目录1.字符串2.布尔类型3.整数4.浮点数5.数字6.列表7.元组8 ...

  4. Python 递归函数 详解

    Python 递归函数 详解   在函数内调用当前函数本身的函数就是递归函数   下面是一个递归函数的实例: 第一次接触递归函数的人,都会被它调用本身而搞得晕头转向,而且看上面的函数调用,得到的结果会 ...

  5. python线程详解

    #线程状态 #线程同步(锁)#多线程的优势在于可以同时运行多个任务,至少感觉起来是这样,但是当线程需要共享数据时,可能存在数据不同步的问题. #threading模块#常用方法:'''threadin ...

  6. python数据类型详解(全面)

    python数据类型详解 目录1.字符串2.布尔类型3.整数4.浮点数5.数字6.列表7.元组8.字典9.日期 1.字符串1.1.如何在Python中使用字符串a.使用单引号(')用单引号括起来表示字 ...

  7. Python Collections详解

    Python Collections详解 collections模块在内置数据结构(list.tuple.dict.set)的基础上,提供了几个额外的数据结构:ChainMap.Counter.deq ...

  8. python生成器详解

    1. 生成器 利用迭代器(迭代器详解python迭代器详解),我们可以在每次迭代获取数据(通过next()方法)时按照特定的规律进行生成.但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记 ...

  9. 转 python数据类型详解

    python数据类型详解 目录 1.字符串 2.布尔类型 3.整数 4.浮点数 5.数字 6.列表 7.元组 8.字典 9.日期 1.字符串 1.1.如何在Python中使用字符串 a.使用单引号(' ...

随机推荐

  1. 【2018沈阳赛区网络预选赛J题】Fantastic Graph 【有上下界的网络流】

    要补的题太多了导致最近没写博客(好吧是我懒) 题目链接https://nanti.jisuanke.com/t/31447 题意 给出一个二分图,问能否挑选出一些边,使得每个点的度数都在[L,R]这个 ...

  2. java web框架发展的新趋势--跨界轻型App

    “跨界(cross over)在汽车界已然成风,将轿车.SUV.跑车和MPV等多种不同元素融为一体的混搭跨界车型,正在成为汽车设计领域的新趋势.从个人而言,当包容.多元的审美要求和物质要求越来越强烈时 ...

  3. BOOST_TYPEOF和BOOST_AUTO

    1.简介 头文件<boost/typeof.hpp>里定义了两个宏:BOOST_TYPEOF和BOOST_AUTO,分别用于仿真C++新标准的typeof和auto关键字,可以在编译期自动 ...

  4. linux sed命令详解-乾颐堂CCIE

    简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的 ...

  5. [SoapUI] SoapUI可以做到些什么?功能有多强大?

    SoapUI. The Swiss-Army Knife of Testing. Whether you’re a tester, developer, business analyst, or ma ...

  6. cef相关

    chrome命令行参数:https://www.cnblogs.com/hushaojun/p/5981646.html cef启动调试,启动的命令行:--disable-web-security - ...

  7. oracle11g客户端配置及使用(Instant Client)

      http://www.oracle.com/technetwork/topics/winx64soft-089540.html http://www.cnblogs.com/ychellboy/a ...

  8. JAVA&JS debug

    JAVA Chrome Sources 如果当前代码所在文件页面为一界面 →                              →| -------------------------- ↓↑ ...

  9. 使用GeoServer+OpenLayers发布和调用WMTS、Vector Tile矢量切片服务 | Publishing and Calling WMTS, Vector Tile Service Using GeoServer + OpenLayers

    Web GIS系列: 1.搭建简易Web GIS网站:使用GeoServer+PostgreSQL+PostGIS+OpenLayers3 2.使用GeoServer+QGIS发布WMTS服务 3.使 ...

  10. Eclipse 调试 NodeJS

    插件地址   http://chromedevtools.googlecode.com/svn/update/dev/ 博客地址 http://www.cnblogs.com/QLeelulu/arc ...