10.5. filecmp文件和目录的比较

源程序代码:Lib/filecmp.py


filecmp模块定义函数来比较文件和目录,与各种可选的时间/正确性权衡取舍。如要比较文件,请参阅difflib模块。

filecmp模块定义了以下函数:

filecmp.cmp(f1, f2[, shallow])

比较文件f1f2,如果它们看上去相等则返回True,否则返回False

除非给出shallow并且为假,否则具有相同os.stat()签名的文件被视为相等。

比较过的文件不会使用该函数再次比较,除非它们的os.stat()签名发生更改。

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

filecmp.cmpfiles(dir1, dir2, common[, shallow])

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

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

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

例如, cmpfiles('a', 'b', ['c', d/e'])将比较a/cb/c以及a/d/eb/d/e 'c''d/e'将出现在返回的三个列表中的一个。

示例:

>>> import filecmp
>>> filecmp.cmp('undoc.rst', 'undoc.rst') 
True
>>> filecmp.cmp('undoc.rst', 'index.rst') 
False

10.5.1. dircmp

dircmp实例使用下面的构造函数创建:

class filecmp.dircmp(a, b[, ignore[, hide]])

构造一个新的目录比较对象,比较目录abignore是要忽略的名称列表,默认为['RCS', 'CVS', 'tags']hide是一个要隐藏的名称列表,并默认为[os.curdir, os.pardir]

dircmp类以shallow 方式比较文件,与filecmp.cmp()的描述一致。

dircmp类提供下列方法:

report()

打印(至 sys.stdoutab之间的比较。

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对象的字典。

以下是一个简化的例子,使用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)