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/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 型別,則是 MyDirCmp 例項,MyDirCmp 是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)