11.5. filecmp - 文件和目录比较

源代码: Lib / filecmp.py

filecmp模块定义了用于比较文件和目录的函数,具有各种可选的时间/正确性权衡。要比较文件,请参见difflib模块。

filecmp模块定义了以下函数:

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

比较名为f1f2的文件,如果它们相等则返回True,否则返回False

如果shallow为真,则具有相同os.stat()签名的文件将被视为相等。否则,将比较文件的内容。

注意该函数没有调用外部的程序,因此给它带来可移植性和高效率。

此函数使用缓存进行过去的比较和结果,如果文件的os.stat()信息更改,缓存条目将无效。可以使用clear_cache()清除整个高速缓存。

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

比较dir1dir2两个目录中文件,文件的名字由common给出。

返回三个文件名列表:matchmismatcherrorsmtach包含匹配文件的列表,mismatch包含不匹配文件的列表,errors列出无法比较的文件的名称。如果文件在其中一个目录中不存在,用户没有足够的权限读取它们,或者某些其他原因不可比较,那么它们将在errors中列出。

shallow参数与filecmp.cmp()具有相同的含义和默认值。

例如,cmpfiles('a', 'b', ['c', 'd / e' ])会将a/cb/ca/d/eb/d/e'c''d/e'将分别位于三个返回的列表之一。

filecmp.clear_cache()

清除filecmp缓存。如果文件在修改后在基础文件系统的mtime分辨率内进行比较,则这可能是有用的。

版本3.4中的新功能。

11.5.1.dircmp

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

构造一个新的目录比较对象,比较目录ab忽略是要忽略的名称列表,默认为filecmp.DEFAULT_IGNORES隐藏是要隐藏的名称列表,默认为[os.curdir, os.pardir]

dircmp类通过对filecmp.cmp()所述执行比较来比较文件。

dircmp类提供以下方法:

report()

ab之间的比较打印(到sys.stdout)。

report_partial_closure()

打印ab以及共有的直接子目录之间的比较。

report_full_closure()

打印ab以及共有的子目录(递归地)之间的比较。

dircmp类提供了许多有趣的属性,可用于获取有关正在比较的目录树的各种位信息。

注意,通过__getattr__()钩子,所有属性都是惰性计算的,因此如果只使用那些轻量级计算的属性,则没有速度损失。

left

目录a

right

目录b

left_list

通过hideignore筛选后,a中的文件和子目录。

right_list

通过hideignore筛选后,b中的文件和子目录。

common

ab中共同的文件和子目录。

left_only

只是a 中的文件和子目录。

right_only

只是b 中的文件和子目录。

common_dirs

ab中共同的子目录。

common_files

ab中的文件。

common_funny

ab中的名称,以使类型在目录之间不同,或os.stat()报告错误的名称。

same_files

ab中相同的文件,使用该类的文件比较运算符。

diff_files

ab中,根据该类的文件比较操作符,其内容不同的文件。

funny_files

ab中无法比较的文件。

subdirs

common_dirs中的名称映射到dircmp对象的字典。

filecmp.DEFAULT_IGNORES

版本3.4中的新功能。

默认情况下,由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)