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/c
与 b/c
和 a/d/e
与 b/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 对象的字典。
实例
判断两个文件夹是否一致
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)
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 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" 转载请保留原文链接及作者。