资源代码:Lib/filecmp.py
filecmp模块定义了用于文件和目录比较的函数,不同函数拥有不同的执行时间和判定策略。对于文件的比较,也可以参见difflib模块。
filecmp模块定义了以下函数:
filecmp. cmp(f1, f2, shallow=True)
比较文件f1和f2,如果他们等价,返回True。
如果shallow为真,具备完全相同的os.stat()签名的文件被认为是等价的。否则,文件的内容将被比较。
注意:该函数不会调用其它程序以实现快捷高效。
该函数使用一个快速缓冲区缓冲过去的比较和比较结果,如果os.stat()中关于文件的信息被改变,缓冲区将完全失效。可以使用clear_cache()清除整个缓冲区。
filecmp. cmpfiles(dir1, dir2, common, shallow=True)
比较两个字典dir1和dir2中具备相同名称的文件。
返回三个列表的文件名:匹配match、不匹配mismatch、错误errors。匹配及不匹配包含的文件顾名思义,而错误列出的文件都是不能比较的。如果文件不存在于某个列表中、用户没有文件读取权限以及因其他原因导致文件无法比较,该文件就会被列入错误errors列表中。
shallow参数与filecmp.cmp()的意义相同。
例如:cmpfiles(‘a’, ‘b’, [‘c’, ‘d/e’])将会比较a/c与b/c,b/d/e和a/d/e,’c’和’d/e’总会在三个结果列表中的某一个钟。
filecmp. clear_cache()
清除filecmp高速缓冲区。如果一个文件在修改后的比较十分快速,甚至超过了底层文件系统的时间分辨率,该缓冲将会有大用。
1. 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__()hooks,所有属性被懒散的计算,因此如果只进行轻量化比较,该类不会有足够的速度。
left
目录a。
right
目录b。
left_list
文件和子目录位于a,通过hide和ignore过滤。
right_list
文件和子目录位于b,通过hide和ignore过滤。
common
文件和子目录同时存在于a与b中。
left_only
文件和子目录只在a中。
right_only
文件和子目录只存在于b中。
common_files
文件同时存在于a与b中。
common_funny
names同时存在于a与b中,这样目录和names间的典型差异由os.stat()报错。
same_files
文件在a与b中都进行了定义,使用类的文件比较操作。
diff_files
文件同时存在于a与b中,内容的差异通过类的文件比较操作进行运算。
funny_files
文件同时存在于a与b中,但是不可以被比较。
subdirs
一个目录,将common_dirs中的names映射到dircmp对象中。
filecmp. DEFAULT_IGNORES
默认下,通过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)