filecmp
--- 檔案和目錄的比較¶
原始碼: Lib/filecmp.py
filecmp
模組定義了用於比較檔案和目錄的函式,這些函式支援多種可選的時間/正確性權衡。要比較檔案,另請參閱 difflib
模組。
filecmp
模組定義了以下函式:
- filecmp.cmp(f1, f2, shallow=True)¶
比較名為 f1 和 f2 的檔案,如果它們看起來相同則返回
True
,否則返回False
。如果 shallow 為真值且兩個檔案的
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/c
和b/c
以及a/d/e
和b/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 中的檔案。
- same_files¶
使用類的檔案比較運算子,在 a 和 b 中都相同的檔案。
- diff_files¶
同時存在於 a 和 b 中,但根據類的檔案比較運算子,內容不同的檔案。
- funny_files¶
同時存在於 a 和 b 中,但無法比較的檔案。
- subdirs¶
一個字典,將
common_dirs
中的名稱對映到dircmp
例項(如果此例項是 MyDirCmp 型別,即dircmp
的子類,則對映到 MyDirCmp 例項)。
這是一個使用 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)