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))>>>
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)),onetwothree>>> print ''.join(restore(diff, 2)),oretreeemu
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,如果這個字符為空格,則將這行忽略掉
新聞熱點
疑難解答