by 千陽
本節主要介紹兩個 Python 中常用于比較資料的子產品,一個是 filecmp 子產品,另一個是 difflib 子產品。其中,前者主要用于比較檔案及目錄,後者主要用于比較序列的類和函數,下面具體介紹兩者的差別。
filecmp 子產品作為 Python 提供的标準庫之一,無需安裝,子產品定義了用于比較檔案及目錄的函數,對伺服器上的檔案目錄的校驗非常實用。
<code>cmp(f1,f2)</code>函數用于比較兩個檔案是否相同,如果 f1 和 f2 相等則傳回True,否則傳回False。例如:
<code>cmpfiles(dir1, dir2, common[, shallow])</code>函數可以用于比較兩個檔案夾内指定的檔案是否相等,參數dir1 和 dir2 是兩個檔案夾路徑,參數common是指定要比較的檔案名清單。
例如,cmpfiles('a', 'b', ['c', 'd/e']) 将會比較 a/c 與 b/c 以及 a/d/e 與 b/d/e。'c' 和 'd/e' 将會各自出現在傳回的三個清單裡的某一個清單中。
<code>clear_cache()</code>函數可以清除檔案比較緩沖區,當比較的檔案不斷地快速修改時,就可以使用這個函數來更新檔案的資訊。
除了以上三個函數外,filecmp 還包含一個用于比較目錄的類——dircmp。
類dircmp(a,b[,ignore[,hide]])用于建立一個比較目錄 a 和 b 的新的目錄比較對象。ignore 是需要忽略的檔案名清單,且預設為 filecmp.DEFAULT_IGNORES。hide 是需要隐藏的檔案名清單,且預設為 [os.curdir, os.pardir]。
dircmp 類提供了三個方法用于比較報告:
report() 将 a 與 b 之間的比較結果列印出來
report_partial_closure() 列印 a 與 b 及共同直接子目錄的比較結果
report_full_closure() 列印 a 與 b 及共同子目錄比較結果(遞歸地)
difflib 子產品是 Python 提供的比較序列差異的功能,包含以下三個類:
Differ 對字元串進行比較
HtmlDiff 将比較結果輸出為html格式
SequenceMatcher 任意類型序列的比較 (可以比較字元串)
Differ類的作用是比較由文本行組成的序列,并産生可供人閱讀的差異或增量資訊。Differ 統一使用 SequenceMatcher 來完成行序列的比較以及相似(接近比對)行内部字元序列的比較。
雙字母代碼
含義
'- '
行為序列 1 所獨有
'+ '
行為序列 2 所獨有
' '
行在兩序列中相同
'? '
行不存在于任一輸入序列
以 '?' 打頭的行嘗試将視線引至行以外而不存在于任一輸入序列的差異。 如果序列包含制表符則這些行可能會令人感到迷惑。
HtmlDiff類可以被用來建立HTML表格 (或者說包含表格的html檔案) ,兩邊對應展示或者行對行的展示比對差異結果。
make_file(fromlines, tolines [, fromdesc][, todesc][, context][, numlines])
make_table(fromlines, tolines [, fromdesc][, todesc][, context][, numlines])
以上兩個方法都可以用來生成包含一個内容為比對結果的表格的html檔案,并且部分内容會高亮顯示。
SequenceMatcher類可用于比較任何類型的序列對,隻要序列元素為 hashable 對象。其思路是找到不包含“垃圾”元素的最長連續比對子序列;所謂“垃圾”元素是指其在某種意義上沒有價值,例如空白行或空白符。
輸出結果:
本節内容介紹了 Python 中 filecmp 和 difflib 兩個子產品的常用操作,對于實作檔案及目錄的比較提供了支撐。
示例代碼:Python-100-days-day043
參考
[1] https://docs.python.org/zh-cn/3.7/library/filecmp.html
[2] https://docs.python.org/zh-cn/3.7/library/difflib.html
關注公衆号:python技術,回複"python"一起學習交流
作者:純潔的微笑
出處:www.ityouknow.com
資源:微信搜【純潔的微笑】關注我,回複 【程式員】【面試】【架構師】有我準備的一線程式必備計算機書籍、大廠面試資料和免費電子書。 一共1024G的資料,希望可以幫助大家提升技術和能力。
本文如對您有幫助,還請多幫 【推薦】 下此文。
點我了解:Tooool-程式員一站式導航網站