On this page
10.5. filecmp —文件和目录比较
源代码: Lib/filecmp.py
filecmp模块定义了用于比较文件和目录的Function,并具有各种可选的时间/正确性折衷方案。要比较文件,另请参见difflib模块。
filecmp模块定义以下Function:
filecmp.
cmp
(* f1 , f2 * [,* shallow *])- 比较名为* f1 和 f2 *的文件,如果看起来相等,则返回
True
,否则返回False
。
- 比较名为* f1 和 f2 *的文件,如果看起来相等,则返回
除非给出* shallow *并且为假,否则具有相同os.stat()签名的文件将被视为相等。
除非更改了它们的os.stat()签名,否则不会再次比较使用此Function比较的文件。
请注意,此函数不会调用任何外部程序,因此可移植性和效率很高。
filecmp.
cmpfiles
(* dir1 , dir2 , common * [,* shallow *])- 比较名称为* common 的两个目录 dir1 和 dir2 *中的文件。
返回三个文件名列表:* match , mismatch , errors 。 * match 包含匹配文件的列表, mismatch 包含不匹配的文件的名称, errors 列出无法比较的文件的名称。如果文件在一个目录中不存在,用户缺乏读取权限或由于其他原因而无法进行比较,则文件会以错误*列出。
- shallow *参数的含义和默认值与filecmp.cmp()相同。
例如,cmpfiles('a', 'b', ['c', 'd/e'])
将a/c
与b/c
和a/d/e
与b/d/e
进行比较。 'c'
和'd/e'
将分别位于返回的三个列表之一中。
Example:
>>> 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 *]])
- 构造一个新的目录比较对象,以比较目录* a 和 b *。 * ignore *是要忽略的名称列表,默认为
['RCS', 'CVS', 'tags']
。 * hide *是要隐藏的名称列表,默认为[os.curdir, os.pardir]
。
- class *
dircmp类pass进行filecmp.cmp()所述的* shallow *比较来比较文件。
dircmp类提供以下方法:
report
( )- 打印(到
sys.stdout
)* a 和 b *之间的比较。
- 打印(到
report_partial_closure
( )- 打印* a 和 b *与常见立即子目录之间的比较。
report_full_closure
( )- 打印* a 和 b *与公共子目录之间的比较(递归)。
dircmp类提供了许多有趣的属性,这些属性可用于获取有关要比较的目录树的各种信息。
请注意,passgetattr()钩子,所有属性都是延迟计算的,因此,如果仅使用那些轻量级的属性,则不会影响速度。
left
- 目录* a *。
right
- 目录* b *。
left_list
-
- a 中的文件和子目录,由 hide 和 ignore *过滤。
-
right_list
-
- b 中的文件和子目录,由 hide 和 ignore *过滤。
-
common
-
- a 和 b *中的文件和子目录。
-
left_only
- 仅在* a *中的文件和子目录。
right_only
- 仅在* b *中的文件和子目录。
common_dirs
-
- a 和 b *中的子目录。
-
common_files
-
- a 和 b *中的文件
-
common_funny
-
- a 和 b *中的名称,以使目录之间的类型不同,或者os.stat()报告错误的名称。
-
same_files
- 使用类的文件比较运算符,* a 和 b *相同的文件。
diff_files
-
- a 和 b *中的文件,其内容根据类的文件比较运算符而不同。
-
funny_files
-
- a 和 b *中都存在但无法比较的文件。
-
subdirs
- 字典将common_dirs对象中的名称 Map 到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)