python3從零學習-5.4.5、文件及目錄的比較模塊filecmp

源代碼: Lib/filecmp.py

filecmp 模塊定義了用於比較文件及目錄的函數,並且可以選取多種關於時間和準確性的折衷方案。對於文件的比較,另見 difflib 模塊。
filecmp 模塊定義瞭如下函數:
  • filecmp.cmp(f1f2shallow=True)

比較名爲 f1 和 f2 的文件,如果它們似乎相等則返回 True ,否則返回 False 。
如果 shallow 爲真,那麼具有相同 os.stat() 簽名的文件將會被認爲是相等的。否則,將比較文件的內容。
需要注意,沒有外部程序被該函數調用,這賦予了該函數可移植性與效率。
該函數會緩存過去的比較及其結果,且在文件的 os.stat() 信息變化後緩存條目失效。所有的緩存可以通過使用 clear_cache() 來清除。
  • filecmp.cmpfiles(dir1dir2commonshallow=True)

比較在兩個目錄 dir1 和 dir2 中,由 common 所確定名稱的文件。
返回三組文件名列表: matchmismatcherrors 。 match 含有相匹配的文件, mismatch 含有那些不匹配的,然後 errors 列出那些未被比較文件的名稱。如果文件不存在於兩目錄中的任一個,或者用戶缺少讀取它們的權限,又或者因爲其他的一些原因而無法比較,那麼這些文件將會被列在 errors 中。
參數 shallow 具有同 filecmp.cmp() 一致的含義與默認值。
例如, cmpfiles('a', 'b', ['c', 'd/e']) 將會比較 a/c 與 b/c 以及 a/d/e 與 b/d/e 。 'c' 和 'd/e' 將會各自出現在返回的三個列表裏的某一個列表中。
  • filecmp.clear_cache()

清除 filecmp 緩存。如果一個文件過快地修改,以至於超過底層文件系統記錄修改時間的精度,那麼該函數可能有助於比較該類文件。
3.4 新版功能.

dircmp 類

  • class filecmp.dircmp(abignore=Nonehide=None)

創建一個用於比較目錄 a 和 b 的新的目錄比較對象。 
ignore 是需要忽略的文件名列表,且默認爲 filecmp.DEFAULT_IGNORES 。 
hide 是需要隱藏的文件名列表,且默認爲 [os.curdir, os.pardir] 。
dircmp 類如 filecmp.cmp() 中所描述的那樣對文件進行 shallow 比較。
dircmp 類提供以下方法:
  • report()

將 a 與 b 之間的比較結果打印(輸出到 sys.stdout )。
  • report_partial_closure()

打印 a 與 b 及共同直接子目錄的比較結果。
  • report_full_closure()

打印 a 與 b 及共同子目錄比較結果(遞歸地)。
dircmp 類提供了一些有趣的屬性,用以得到關於參與比較的目錄樹的各種信息。
需要注意,通過 __getattr__() 鉤子,所有的屬性將會惰性求值,因此如果只使用那些計算簡便的屬性,將不會有速度損失。

left

目錄 a 。

right

目錄 b 。

left_list

經 hide 和 ignore 過濾,目錄 a 中的文件與子目錄。

right_list

經 hide 和 ignore 過濾,目錄 b 中的文件與子目錄。

common

同時存在於目錄 a 和 b 中的文件和子目錄。

left_only

僅在目錄 a 中的文件和子目錄。

right_only

僅在目錄 b 中的文件和子目錄。

common_dirs

同時存在於目錄 a 和 b 中的子目錄。

common_files

同時存在於目錄 a 和 b 中的文件。

common_funny

在目錄 a 和 b 中類型不同的名字,或者那些 os.stat() 報告錯誤的名字。

same_files

在目錄 a 和 b 中,使用類的文件比較操作符判定相等的文件。

diff_files

在目錄 a 和 b 中,根據類的文件比較操作符判定內容不等的文件。

funny_files

在目錄 a 和 b 中無法比較的文件。

subdirs

一個將 common_dirs 中名稱映射爲 dircmp 對象的字典。

filecmp.DEFAULT_IGNORES

3.4 新版功能.
默認被 dircmp 忽略的目錄列表。
下面是一個簡單的例子,使用 subdirs 屬性遞歸搜索兩個目錄以顯示公共差異文件:
>>> from filecmp import dircmp
>>> def print_diff_files(dcmp):
...     for name in dcmp.diff_files:
...         print("diff_file %s found in %s and %s" % (name, dcmp.left,
...               dcmp.right))
...     for sub_dcmp in dcmp.subdirs.values():
...         print_diff_files(sub_dcmp)
...
>>> dcmp = dircmp('dir1', 'dir2')
>>> print_diff_files(dcmp)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章