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時表示不自動換行
linejunk 和 charjunk,可選參數,在ndiff()中使用,
這個類的公共方法:
make_file(fromlines, tolines [, fromdesc][, todesc][, context][, numlines])
用來生成一個包含表格的html文件,其內容是用來展示差異。
fromlines 和tolines,用於比較的內容,格式為字符串組成的列表
fromdesc 和 todesc,可選參數,對應的fromlines,tolines的差異化文件的標題,默認為空字符串
context 和 numlines,可選參數,context 為True時,只顯示差異的上下文,為false,顯示全文,numlines默認為5,當context為True時,控制展示上下文的行數,當context為false時,控制不同差異的高亮之間移動時“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,如果這個字符為空格,則將這行忽略掉