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 緩存。如果一個文件過快地修改,以至于超過底層文件系統記錄修改時間的精度,那么該函數可能有助于比較該類文件。
3.4 新版功能.
dircmp 類?
-
class
filecmp.dircmp(a, b, ignore=None, hide=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 中的文件。
-
same_files? 在目錄 a 和 b 中,使用類的文件比較操作符判定相等的文件。
-
diff_files? 在目錄 a 和 b 中,根據類的文件比較操作符判定內容不等的文件。
-
funny_files? 在目錄 a 和 b 中無法比較的文件。
-
subdirs? 一個將
common_dirs中名稱映射為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)
