python difflib詳解


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,如果這個字符為空格,則將這行忽略掉


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM