filecmp --- 檔案和目錄的比較

原始碼: Lib/filecmp.py


filecmp 模組定義了用於比較檔案和目錄的函式,這些函式支援多種可選的時間/正確性權衡。要比較檔案,另請參閱 difflib 模組。

filecmp 模組定義了以下函式:

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

比較名為 f1f2 的檔案,如果它們看起來相同則返回 True,否則返回 False

如果 shallow 為真值且兩個檔案的 os.stat() 簽名信息(檔案型別、大小和修改時間)都相同,則檔案被視為相等。

否則,如果檔案的大小或內容不同,則它們被視為不相同。

請注意,此函式不會呼叫外部程式,因此具有可移植性和高效率。

此函式會為過去的比較及其結果使用快取,如果檔案的 os.stat() 資訊發生改變,則快取條目會失效。整個快取可使用 clear_cache() 來清除。

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

比較 dir1dir2 這兩個目錄中由 common 指定的檔案。

返回三個檔名列表:matchmismatcherrorsmatch 包含匹配的檔案列表,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)

構建一個新的目錄比較物件,用於比較目錄 abignore 是要忽略的名稱列表,預設為 filecmp.DEFAULT_IGNOREShide 是要隱藏的名稱列表,預設為 [os.curdir, os.pardir]

dircmp 類預設透過使用 shallow 形參進行 filecmp.cmp() 中描述的*淺*比較來比較檔案。

在 3.13 版本發生變更: 添加了 shallow 形參。

dircmp 類提供了以下方法:

report()

列印(到 sys.stdoutab 之間的比較結果。

report_partial_closure()

列印 ab 以及共同的直接子目錄之間的比較結果。

report_full_closure()

列印 ab 以及共同的子目錄(遞迴地)之間的比較結果。

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

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

left

目錄 a

right

目錄 b

left_list

a 中的檔案和子目錄,經過 hideignore 過濾。

right_list

b 中的檔案和子目錄,經過 hideignore 過濾。

common

同時存在於 ab 中的檔案和子目錄。

left_only

只在 a 中存在的檔案和子目錄。

right_only

只在 b 中存在的檔案和子目錄。

common_dirs

同時存在於 ab 中的子目錄。

common_files

同時存在於 ab 中的檔案。

common_funny

同時存在於 ab 中,但在兩個目錄間型別不同的名稱,或者 os.stat() 報告錯誤的名稱。

same_files

使用類的檔案比較運算子,在 ab 中都相同的檔案。

diff_files

同時存在於 ab 中,但根據類的檔案比較運算子,內容不同的檔案。

funny_files

同時存在於 ab 中,但無法比較的檔案。

subdirs

一個字典,將 common_dirs 中的名稱對映到 dircmp 例項(如果此例項是 MyDirCmp 型別,即 dircmp 的子類,則對映到 MyDirCmp 例項)。

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