filecmp — 檔案和目錄比較

原始碼: Lib/filecmp.py


filecmp 模組定義了用於比較檔案和目錄的函式,具有各種可選的時間/正確性權衡。對於比較檔案,另請參閱 difflib 模組。

filecmp 模組定義了以下函式

filecmp.cmp(f1, f2, shallow=True)

比較名為 *f1* 和 *f2* 的檔案,如果它們看起來相等則返回 True,否則返回 False

如果 *shallow* 為 true 且兩個檔案的 os.stat() 簽名(檔案型別、大小和修改時間)相同,則認為檔案相等。

否則,如果檔案的大小或內容不同,則認為檔案不同。

請注意,此函式不呼叫任何外部程式,從而使其具有可移植性和效率。

此函式使用快取來儲存過去的比較和結果,如果檔案的 os.stat() 資訊發生更改,則快取條目將失效。可以使用 clear_cache() 清除整個快取。

filecmp.cmpfiles(dir1, dir2, common, shallow=True)

比較兩個目錄 *dir1* 和 *dir2* 中名稱由 *common* 給出的檔案。

返回三個檔名列表:*match*、*mismatch*、*errors*。*match* 包含匹配的檔案列表,*mismatch* 包含不匹配的檔名,*errors* 列出無法比較的檔名。如果檔案不存在於其中一個目錄中,使用者缺少讀取它們的許可權,或者由於其他原因無法進行比較,則檔案將列在 *errors* 中。

*shallow* 引數的含義和預設值與 filecmp.cmp() 相同。

例如,cmpfiles('a', 'b', ['c', 'd/e']) 將比較 a/cb/c 以及 a/d/eb/d/e'c''d/e' 將分別位於三個返回列表之一中。

filecmp.clear_cache()

清除 filecmp 快取。如果一個檔案在修改後很快就被比較,以至於在底層檔案系統的 mtime 解析度之內,這可能會很有用。

3.4 版本新增。

dircmp

class filecmp.dircmp(a, b, ignore=None, hide=None, *, shallow=True)

構造一個新的目錄比較物件,以比較目錄 *a* 和 *b*。*ignore* 是要忽略的名稱列表,預設為 filecmp.DEFAULT_IGNORES。*hide* 是要隱藏的名稱列表,預設為 [os.curdir, os.pardir]

dircmp 類使用 *shallow* 引數預設執行 filecmp.cmp() 中描述的淺層比較來比較檔案。

在 3.13 版本中更改: 添加了 *shallow* 引數。

dircmp 類提供以下方法

report()

列印(到 sys.stdout)*a* 和 *b* 之間的比較。

report_partial_closure()

列印 *a* 和 *b* 以及公共直接子目錄之間的比較。

report_full_closure()

列印 *a* 和 *b* 以及公共子目錄(遞迴)之間的比較。

dircmp 類提供了許多有用的屬性,可用於獲取有關正在比較的目錄樹的各種資訊。

請注意,透過 __getattr__() 鉤子,所有屬性都是惰性計算的,因此如果僅使用那些計算量較小的屬性,則不會有速度損失。

left

目錄 *a*。

right

目錄 *b*。

left_list

目錄 *a* 中的檔案和子目錄,由 *hide* 和 *ignore* 過濾。

right_list

目錄 *b* 中的檔案和子目錄,由 *hide* 和 *ignore* 過濾。

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 例項(如果此例項是 MyDirCmp 型別,則是 MyDirCmp 例項,MyDirCmp 是 dircmp 的子類)。

在 3.10 版本中更改: 之前,條目始終是 dircmp 例項。現在,如果 selfdircmp 的子類,則條目與 self 的型別相同。

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)