首頁  >  文章  >  後端開發  >  python difflib模組詳解

python difflib模組詳解

巴扎黑
巴扎黑原創
2017-09-15 10:45:356065瀏覽

這篇文章主要為大家詳細介紹了python difflib模組的範例,具有一定的參考價值,有興趣的小夥伴們可以參考一下

difflib模組提供的類別和方法用來進行序列的差異化比較,它能夠比對檔案並產生差異結果文字或html格式的差異化比較頁面,如果需要比較目錄的不同,可以使用filecmp模組。

class difflib.SequenceMatcher

這類提供了比較任意可雜湊類型序列對方法。此方法將尋找沒有包含‘垃圾'元素的最大連續匹配序列。

透過演算法的複雜度比較,它由於原始的完形匹配演算法,在最壞情況下有n的平方次運算,在最好情況下,具有線性的效率。

它具有自動垃圾啟發式,可以將重複超過片段1%或重複200次的字元當作垃圾來處理。可以透過將autojunk設定為false關閉該功能。

class difflib.Differ

此類比較的是文字行的差異並且產生適合人類閱讀的差異結果或增量結果,結果中各部分的表示如下:

python difflib模組詳解

class difflib.HtmlDiff

 此類可以用來建立HTML表格(或說包含表格的html檔) ,兩邊對應展示或行對行的展示比對差異結果。

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

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

以上兩個方法都可以用來產生包含一個內容為比對結果的表格的html文件,並且部分內容會高亮顯示。

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

#比較a與b(字串列表),並且傳回一個差異文字行的生成器
範例:


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

傳回最大符合結果的清單

#範例:


##

>>> 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(字串清單),傳回一個Differ-style 的差異結果

範例:


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

傳回一個由兩個比對序列產生的結果


範例


>>> 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(字串列表),傳回一個unified 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

實際應用範例

比對兩個文件,然後產生一個展示差異結果的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()

運行結果:

python difflib模組詳解

產生的html檔案比對結果:

python difflib模組詳解

以上是python difflib模組詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn