filecmp
--- 文件及目錄的比較?
源代碼: Lib/filecmp.py
filecmp
模塊定義了用于比較文件及目錄的函數(shù),并且可以選取多種關(guān)于時(shí)間和準(zhǔn)確性的折衷方案。對(duì)于文件的比較,另見(jiàn) difflib
模塊。
filecmp
模塊定義了如下函數(shù):
- filecmp.cmp(f1, f2, shallow=True)?
比較名為 f1 和 f2 的文件,如果它們似乎相等則返回
True
,否則返回False
。如果 shallow 為真值且兩個(gè)文件的
os.stat()
簽名信息(文件類(lèi)型、大小和修改時(shí)間)一致,則文件會(huì)被視為相同。在其他情況下,如果文件大小或內(nèi)容不同則它們會(huì)被視為不同。
需要注意,沒(méi)有外部程序被該函數(shù)調(diào)用,這賦予了該函數(shù)可移植性與效率。
該函數(shù)會(huì)緩存過(guò)去的比較及其結(jié)果,且在文件的
os.stat()
信息變化后緩存條目失效。所有的緩存可以通過(guò)使用clear_cache()
來(lái)清除。
- filecmp.cmpfiles(dir1, dir2, common, shallow=True)?
比較在兩個(gè)目錄 dir1 和 dir2 中,由 common 所確定名稱(chēng)的文件。
返回三組文件名列表: match, mismatch, errors 。 match 含有相匹配的文件, mismatch 含有那些不匹配的,然后 errors 列出那些未被比較文件的名稱(chēng)。如果文件不存在于兩目錄中的任一個(gè),或者用戶(hù)缺少讀取它們的權(quán)限,又或者因?yàn)槠渌囊恍┰蚨鵁o(wú)法比較,那么這些文件將會(huì)被列在 errors 中。
參數(shù) shallow 具有同
filecmp.cmp()
一致的含義與默認(rèn)值。例如,
cmpfiles('a', 'b', ['c', 'd/e'])
將會(huì)比較a/c
與b/c
以及a/d/e
與b/d/e
。'c'
和'd/e'
將會(huì)各自出現(xiàn)在返回的三個(gè)列表里的某一個(gè)列表中。
- filecmp.clear_cache()?
清除 filecmp 緩存。如果一個(gè)文件過(guò)快地修改,以至于超過(guò)底層文件系統(tǒng)記錄修改時(shí)間的精度,那么該函數(shù)可能有助于比較該類(lèi)文件。
3.4 新版功能.
dircmp
類(lèi)?
- class filecmp.dircmp(a, b, ignore=None, hide=None)?
創(chuàng)建一個(gè)用于比較目錄 a 和 b 的新的目錄比較對(duì)象。 ignore 是需要忽略的文件名列表,且默認(rèn)為
filecmp.DEFAULT_IGNORES
。 hide 是需要隱藏的文件名列表,且默認(rèn)為[os.curdir, os.pardir]
。dircmp
類(lèi)如filecmp.cmp()
中所描述的那樣對(duì)文件進(jìn)行 shallow 比較。dircmp
類(lèi)提供以下方法:- report()?
將 a 與 b 之間的比較結(jié)果打?。ǖ?
sys.stdout
)。
- report_partial_closure()?
打印 a 與 b 及共同直接子目錄的比較結(jié)果。
- report_full_closure()?
打印 a 與 b 及共同子目錄比較結(jié)果(遞歸地)。
dircmp
類(lèi)提供了一些有趣的屬性,用以得到關(guān)于參與比較的目錄樹(shù)的各種信息。需要注意,通過(guò)
__getattr__()
鉤子,所有的屬性將會(huì)惰性求值,因此如果只使用那些計(jì)算簡(jiǎn)便的屬性,將不會(huì)有速度損失。- left?
目錄 a 。
- right?
目錄 b 。
- left_list?
經(jīng) hide 和 ignore 過(guò)濾,目錄 a 中的文件與子目錄。
- right_list?
經(jīng) hide 和 ignore 過(guò)濾,目錄 b 中的文件與子目錄。
- common?
同時(shí)存在于目錄 a 和 b 中的文件和子目錄。
- left_only?
僅在目錄 a 中的文件和子目錄。
- right_only?
僅在目錄 b 中的文件和子目錄。
- common_dirs?
同時(shí)存在于目錄 a 和 b 中的子目錄。
- common_files?
同時(shí)存在于目錄 a 和 b 中的文件。
- same_files?
在目錄 a 和 b 中,使用類(lèi)的文件比較操作符判定相等的文件。
- diff_files?
在目錄 a 和 b 中,根據(jù)類(lèi)的文件比較操作符判定內(nèi)容不等的文件。
- funny_files?
在目錄 a 和 b 中無(wú)法比較的文件。
- subdirs?
一個(gè)將
common_dirs
中的名稱(chēng)映射到dircmp
實(shí)例(或者 MyDirCmp 實(shí)例,如果該實(shí)例類(lèi)型為dircmp
的子類(lèi) MyDirCmp 的話)的字典。
下面是一個(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)