filecmp —文件和目录比较

源代码: Lib/filecmp.py


filecmp模块定义了用于比较文件和目录的Function,并具有各种可选的时间/正确性折衷方案。要比较文件,另请参见difflib模块。

filecmp模块定义以下Function:

  • filecmp. cmp(* f1 f2 shallow = True *)
    • 比较名为* f1 f2 *的文件,如果看起来相等,则返回True,否则返回False

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

请注意,此函数不会调用任何外部程序,因此可移植性和效率很高。

此Function将缓存用于过去的比较和结果,如果文件的os.stat()信息发生更改,则缓存条目将无效。可以使用clear_cache()清除整个缓存。

  • filecmp. cmpfiles(* dir1 dir2 common shallow = True *)
    • 比较名称为* common 的两个目录 dir1 dir2 *中的文件。

返回三个文件名列表:* match mismatch errors 。 * match 包含匹配文件的列表, mismatch 包含不匹配的文件的名称, errors 列出无法比较的文件的名称。如果文件在一个目录中不存在,用户缺乏读取权限或由于其他原因而无法进行比较,则文件会以错误*列出。

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

  • filecmp. clear_cache ( )
    • 清除 filecmp 缓存。如果在修改文件后如此快速地比较文件,使其在基础文件系统的 mtime 分辨率之内,则这可能很有用。

3.4 版的新Function。

dircmp 类

    • class * filecmp. dircmp(* a b ignore = None hide = None *)
    • 构造一个新的目录比较对象,以比较目录* a b *。 * ignore *是要忽略的名称列表,默认为filecmp.DEFAULT_IGNORES。 * hide *是要隐藏的名称列表,默认为[os.curdir, os.pardir]

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

  • filecmp. DEFAULT_IGNORES

    • 3.4 版的新Function。

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