• python difflib模块讲解示例


     

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

    class difflib.SequenceMatcher

    此类提供了比较任意可哈希类型序列对方法。此方法将寻找没有包含‘垃圾’元素的最大连续匹配序列。
    
    通过对算法的复杂度比较,它由于原始的完形匹配算法,在最坏情况下有n的平方次运算,在最好情况下,具有线性的效率。
    
    它具有自动垃圾启发式,可以将重复超过片段1%或者重复200次的字符作为垃圾来处理。可以通过将autojunk设置为false关闭该功能。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    class difflib.Differ

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


    class difflib.HtmlDiff

     此类可以被用来创建HTML表格 (或者说包含表格的html文件) ,两边对应展示或者行对行的展示比对差异结果。
    
     make_file(fromlines, tolines [, fromdesc][, todesc][, context][, numlines])
    
    make_table(fromlines, tolines [, fromdesc][, todesc][, context][, numlines])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

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

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

    示例:

    >>> s1 = ['bacon
    ', 'eggs
    ', 'ham
    ', 'guido
    ']
    >>> s2 = ['python
    ', 'eggy
    ', 'hamster
    ', 'guido
    ']
    >>> 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    difflib.get_close_matches(word, possibilities[, n][, cutoff])

    返回最大匹配结果的列表
    
    • 1
    • 2

    示例:

    >>> 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']
    
    • 1
    • 2

     

    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    difflib.ndiff(a, b[, linejunk][, charjunk])

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

    示例:

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

    difflib.restore(sequence, which)

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

    示例

    >>> diff = ndiff('one
    two
    three
    '.splitlines(1),
    ...              'ore
    tree
    emu
    '.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格式的差异结果.
    
    • 1
    • 2

    示例:

    >>> s1 = ['bacon
    ', 'eggs
    ', 'ham
    ', 'guido
    ']
    >>> s2 = ['python
    ', 'eggy
    ', 'hamster
    ', 'guido
    ']
    >>> 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()

    运行结果:

    生成的html文件比对结果 


     

    ---------------------------------------------------------------------------------

     

    关注微信公众号即可在手机上查阅,并可接收更多测试分享~

     

     

  • 相关阅读:
    [LeetCode] Meeting Rooms I & II
    [LeetCode] Graph Valid Tree
    [LeetCode] Palindrome Permutation I & II
    [LeetCode] Encode and Decode Strings
    [LeetCode] Paint Fence
    android 发送短信功能
    andrioid 分享到其它(短信,qq,微信等功能)
    android Dialog实例
    android开发之onCreate( )方法详解
    android edittext属性说明
  • 原文地址:https://www.cnblogs.com/songzhenhua/p/9312705.html
Copyright © 2020-2023  润新知