Python filecmp 文件和目录比较

filecmp,文件比较

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

filecmp 模块定义了以下函数:

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

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

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

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

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

比较 dir1 和 dir2 两个目录中文件,文件的名字由 common 给出。返回三个文件名列表:match、mismatch、errors。

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

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

filecmp.clear_cache()

清除 filecmp 缓存。

dircmp,目录比较

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

构造一个新的目录比较对象,比较目录 a 和 b。ignore 是要忽略的名称列表,默认为 filecmp.DEFAULT_IGNORES 。hide 是要隐藏的名称列表,默认为 os.curdir(.)os.pardir(..)

filecmp.DEFAULT_IGNORES:['RCS', 'CVS', 'tags', '.git', '.hg', '.bzr', 'darcs', '_pycache']

方法

report()

打印 a 和 b 之间的比较报告,仅仅展示了给定的两个目录比较结果而没有递归。这里没有办法像 cmp() 那样比较文件内容。即具有相同 os.stat() 签名的文件将被视为相等。

report_partial_closure()

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

report_full_closure()

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

属性

可用于获取有关正在比较的目录树的各种位信息。

  • left:目录 a。
  • right:目录 b。
  • left_list:通过 hide 和 ignore 筛选后,a 中的文件和子目录(不含 a)。
  • right_list:通过 hide 和 ignore 筛选后,b 中的文件和子目录。
  • common:a 和 b 中共同的文件和子目录。
  • left_only:只是 a 中的文件和子目录。
  • right_only:只是 b 中的文件和子目录。
  • common_dirs:a 和 b 中共同的子目录。
  • common_files:a 和 b 中的文件。
  • common_funny:a 和 b 中的名称,以使类型在目录之间不同,或 os.stat() 报告错误的名称。在 a 中是一个文件,而在 b 中是个子目录。
  • same_files:a 和 b 中相同的文件,使用该类的文件比较运算符(os.stat())。
  • diff_files:a 和 b 中根据该类的文件比较操作符,其内容不同的文件。
  • funny_files:a 和 b 中无法比较的文件。
  • subdirs:将 common_dirs 中的名称映射到 dircmp 对象的字典。

实例

判断两个文件夹是否一致

https://bbs.csdn.net/topics/392363043

from filecmp import dircmp

def is_samedir(dcmp):
    if(len(dcmp.diff_files + dcmp.left_only + dcmp.right_only)):
        return False
    for sub_dcmp in dcmp.subdirs.values():
        is_samedir(sub_dcmp)
    return True

dcmp = dircmp(r'D:\dir1',r'D:\dir2')
print(is_samedir(dcmp))

使用 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(r'D:\dir1',r'D:\dir2')
print_diff_files(dcmp)

https://docs.python.org/3/library/filecmp.html


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com

文章标题:Python filecmp 文件和目录比较

文章字数:948

本文作者:Bin

发布时间:2019-01-26, 14:03:29

最后更新:2019-08-06, 00:07:35

原始链接:http://coolview.github.io/2019/01/26/Python/Python%20filecmp%20%E6%96%87%E4%BB%B6%E5%92%8C%E7%9B%AE%E5%BD%95%E6%AF%94%E8%BE%83/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录