filecmp ---文件和目录比较

源代码: Lib/filecmp.py


这个 filecmp 模块定义用于比较文件和目录的函数,以及各种可选的时间/正确性权衡。有关比较文件的信息,请参见 difflib 模块。

这个 filecmp 模块定义以下功能:

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

比较名为的文件 f1f2 归来 True 如果它们看起来相等, False 否则。

如果 浅的 为真,文件与 os.stat() 签名被认为是平等的。否则,将比较文件的内容。

请注意,此函数没有调用任何外部程序,因此它具有可移植性和效率。

此函数将缓存用于过去的比较和结果,如果 os.stat() 文件更改信息。整个缓存可以使用 clear_cache() .

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

比较两个目录中的文件 dir1dir2 其姓名由 常见的 .

返回三个文件名列表: 比赛不匹配errors . 比赛 包含匹配的文件列表, 不匹配 包含不包含的名称,以及 errors 列出无法比较的文件名。文件列在 errors 如果它们不存在于某个目录中,那么用户就没有读取它们的权限,或者由于其他原因无法进行比较。

这个 浅的 参数的含义和默认值与 filecmp.cmp() .

例如, cmpfiles('a', 'b', ['c', 'd/e']) 将比较 a/c 具有 b/ca/d/e 具有 b/d/e . 'c''d/e' 将在三个返回列表中的一个列表中。

filecmp.clear_cache()

清除filecmp缓存。如果一个文件在被修改后被如此快速地比较,以至于它在底层文件系统的mtime解析范围内,那么这可能是有用的。

3.4 新版功能.

这个 dircmp

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

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

这个 dircmp 类通过执行比较文件 浅的 如前所述的比较 filecmp.cmp() .

这个 dircmp 类提供以下方法:

report()

打印(到) sys.stdout )比较 ab .

report_partial_closure()

打印比较 ab 以及常见的直接子目录。

report_full_closure()

打印比较 ab 和公共子目录(递归)。

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

注意通过 __getattr__() 钩子,所有属性都是延迟计算的,所以如果只使用那些轻量级的属性,就不会有速度损失。

left

目录 a .

right

目录 b .

left_list

中的文件和子目录 a 过滤 hide忽视 .

right_list

中的文件和子目录 b 过滤 hide忽视 .

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_dirsdircmp 实例(如果此实例的类型为MyDirCmp,则为MyDirCmp实例,MyDirCmp的子类 dircmp )。

在 3.10 版更改: 以前的条目总是 dircmp 实例。现在条目的类型与 self ,如果 self 是的子类 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)