filecmp --- 文件及目錄的比較?

源代碼: Lib/filecmp.py


filecmp 模塊定義了用于比較文件及目錄的函數,并且可以選取多種關(guān)于時(shí)間和準確性的折衷方案。對于文件的比較,另見(jiàn) difflib 模塊。

filecmp 模塊定義了如下函數:

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

比較名為 f1f2 的文件,如果它們似乎相等則返回 True ,否則返回 False 。

如果 shallow 為真值且兩個(gè)文件的 os.stat() 簽名信息(文件類(lèi)型、大小和修改時(shí)間)一致,則文件會(huì )被視為相同。

在其他情況下,如果文件大小或內容不同則它們會(huì )被視為不同。

需要注意,沒(méi)有外部程序被該函數調用,這賦予了該函數可移植性與效率。

該函數會(huì )緩存過(guò)去的比較及其結果,且在文件的 os.stat() 信息變化后緩存條目失效。所有的緩存可以通過(guò)使用 clear_cache() 來(lái)清除。

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

比較在兩個(gè)目錄 dir1dir2 中,由 common 所確定名稱(chēng)的文件。

返回三組文件名列表: match, mismatch, errors 。 match 含有相匹配的文件, mismatch 含有那些不匹配的,然后 errors 列出那些未被比較文件的名稱(chēng)。如果文件不存在于兩目錄中的任一個(gè),或者用戶(hù)缺少讀取它們的權限,又或者因為其他的一些原因而無(wú)法比較,那么這些文件將會(huì )被列在 errors 中。

參數 shallow 具有同 filecmp.cmp() 一致的含義與默認值。

例如, cmpfiles('a', 'b', ['c', 'd/e']) 將會(huì )比較 a/cb/c 以及 a/d/eb/d/e 。 'c''d/e' 將會(huì )各自出現在返回的三個(gè)列表里的某一個(gè)列表中。

filecmp.clear_cache()?

清除 filecmp 緩存。如果一個(gè)文件過(guò)快地修改,以至于超過(guò)底層文件系統記錄修改時(shí)間的精度,那么該函數可能有助于比較該類(lèi)文件。

3.4 新版功能.

dircmp 類(lèi)?

class filecmp.dircmp(a, b, ignore=None, hide=None)?

創(chuàng )建一個(gè)用于比較目錄 ab 的新的目錄比較對象。 ignore 是需要忽略的文件名列表,且默認為 filecmp.DEFAULT_IGNORES 。 hide 是需要隱藏的文件名列表,且默認為 [os.curdir, os.pardir] 。

dircmp 類(lèi)如 filecmp.cmp() 中所描述的那樣對文件進(jìn)行 shallow 比較。

dircmp 類(lèi)提供以下方法:

report()?

ab 之間的比較結果打?。ǖ? sys.stdout )。

report_partial_closure()?

打印 ab 及共同直接子目錄的比較結果。

report_full_closure()?

打印 ab 及共同子目錄比較結果(遞歸地)。

dircmp 類(lèi)提供了一些有趣的屬性,用以得到關(guān)于參與比較的目錄樹(shù)的各種信息。

需要注意,通過(guò) __getattr__() 鉤子,所有的屬性將會(huì )惰性求值,因此如果只使用那些計算簡(jiǎn)便的屬性,將不會(huì )有速度損失。

left?

目錄 a 。

right?

目錄 b 。

left_list?

經(jīng) hideignore 過(guò)濾,目錄 a 中的文件與子目錄。

right_list?

經(jīng) hideignore 過(guò)濾,目錄 b 中的文件與子目錄。

common?

同時(shí)存在于目錄 ab 中的文件和子目錄。

left_only?

僅在目錄 a 中的文件和子目錄。

right_only?

僅在目錄 b 中的文件和子目錄。

common_dirs?

同時(shí)存在于目錄 ab 中的子目錄。

common_files?

同時(shí)存在于目錄 ab 中的文件。

common_funny?

在目錄 ab 中類(lèi)型不同的名字,或者那些 os.stat() 報告錯誤的名字。

same_files?

在目錄 ab 中,使用類(lèi)的文件比較操作符判定相等的文件。

diff_files?

在目錄 ab 中,根據類(lèi)的文件比較操作符判定內容不等的文件。

funny_files?

在目錄 ab 中無(wú)法比較的文件。

subdirs?

一個(gè)將 common_dirs 中的名稱(chēng)映射到 dircmp 實(shí)例(或者 MyDirCmp 實(shí)例,如果該實(shí)例類(lèi)型為 dircmp 的子類(lèi) MyDirCmp 的話(huà))的字典。

在 3.10 版更改: 在之前版本中字典條目總是為 dircmp 實(shí)例。 現在條目將與 self 的類(lèi)型相同,如果 selfdircmp 的子類(lèi)的話(huà)。

filecmp.DEFAULT_IGNORES?

3.4 新版功能.

默認被 dircmp 忽略的目錄列表。

下面是一個(gè)簡(jiǎn)單的例子,使用 subdirs 屬性遞歸搜索兩個(gè)目錄以顯示公共差異文件:

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