python filecmp.dircmp实现递归比对两个目录的方法


Posted in Python onMay 22, 2020

使用python filecmp模块的dircmp类可以很方便的比对两个目录,dircmp的用法已经有很多文章介绍,不再赘述。

可以help(filecmp.dircmp)查看帮助信息,其中提到的x.report()、x.report_partial_closure(),都只能打印两目录一级子目录的比较信息。而x.report_full_closure()可以递归打印所有子目录的比对信息,但是输出太多,大多数情况下我们可能只关心两目录的不同之处。

help(filecmp.dircmp) 摘选:            
 
 | High level usage:              
 | x = dircmp(dir1, dir2)             
 | x.report() -> prints a report on the differences between dir1 and dir2 
 |  or                 
 | x.report_partial_closure() -> prints report on differences between dir1
 |   and dir2, and reports on common immediate subdirectories.  
 | x.report_full_closure() -> like report_partial_closure,    
 |   but fully recursive.

    本文编写的脚本,重点关注并实现两个目标:

1)递归比对两个目录及其所有子目录。

2)仅输出两目录不同之处,包括文件名相同(common_files)但是文件不一致(diff_files),以及左、右目录中独有的文件或子目录。

py脚本compare_dir.py内容如下:

# -*- coding: utf-8 -*-
"""
@desc 使用filecmp.dircmp递归比对两个目录,输出比对结果以及统计信息。
@author longfeiwlf
@date 2020-5-20
"""
 
from filecmp import dircmp
import sys
 
# 定义全局变量:
number_different_files = 0 # 文件名相同但不一致的文件数
number_left_only = 0 # 左边目录独有的文件或目录数
number_right_only = 0 # 右边目录独有的文件或目录数
 
 
def print_diff(dcmp):
 """递归比对两目录,如果有不同之处,打印出来,同时累加统计计数。"""
 global number_different_files
 global number_left_only
 global number_right_only
 for name in dcmp.diff_files:
  print("diff_file found: %s/%s" % (dcmp.left, name))
  number_different_files += 1
 for name_left in dcmp.left_only:
  print("left_only found: %s/%s" % (dcmp.left, name_left))
  number_left_only += 1
 for name_right in dcmp.right_only:
  print("right_only found: %s/%s" % (dcmp.right, name_right))
  number_right_only += 1
 for sub_dcmp in dcmp.subdirs.values():
  print_diff(sub_dcmp) # 递归比较子目录
 
 
if __name__ == '__main__':
 try:
  mydcmp = dircmp(sys.argv[1], sys.argv[2])
 except IndexError as ie:
  print(ie)
  print("使用方法:python compare_dir_cn.py 目录1 目录2")
 else:
  print("\n比对结果详情: ")
  print_diff(mydcmp)
  if (number_different_files == 0 and number_left_only == 0
    and number_right_only == 0):
   print("\n两个目录完全一致!")
  else:
   print("\n比对结果统计:")
   print("Total Number of different files is: " 
     + str(number_different_files))
   print("Total Number of files or directories only in '"
     + sys.argv[1] + "' is: " + str(number_left_only))
   print("Total Number of files or directories only in '"
     + sys.argv[2] + "' is: " + str(number_right_only))

compare_dir.py脚本使用举例:

python filecmp.dircmp实现递归比对两个目录的方法

总结

到此这篇关于filecmp.dircmp实现递归比对两个目录的文章就介绍到这了,更多相关filecmp.dircmp实现递归比对两个目录内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
使用Python下载歌词并嵌入歌曲文件中的实现代码
Nov 13 Python
Python 提取dict转换为xml/json/table并输出的实现代码
Aug 28 Python
Python用UUID库生成唯一ID的方法示例
Dec 15 Python
解决nohup重定向python输出到文件不成功的问题
May 11 Python
详解Appium+Python之生成html测试报告
Jan 04 Python
Python3+Selenium+Chrome实现自动填写WPS表单
Feb 12 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
Mar 09 Python
python 连续不等式语法糖实例
Apr 15 Python
QML实现钟表效果
Jun 02 Python
keras 自定义loss层+接受输入实例
Jun 28 Python
python 最简单的实现适配器设计模式的示例
Jun 30 Python
基于PyInstaller各参数的含义说明
Mar 04 Python
关于keras.layers.Conv1D的kernel_size参数使用介绍
May 22 #Python
Python参数传递对象的引用原理解析
May 22 #Python
Python configparser模块常用方法解析
May 22 #Python
keras中的卷积层&池化层的用法
May 22 #Python
Keras Convolution1D与Convolution2D区别说明
May 22 #Python
Python pip安装模块提示错误解决方案
May 22 #Python
keras中的backend.clip用法
May 22 #Python
You might like
第八节 访问方式 [8]
2006/10/09 PHP
PHP如何利用P3P实现跨域
2013/08/24 PHP
Destoon实现多表查询示例
2014/08/21 PHP
功能强大的php分页函数
2016/07/20 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
PHP基于GD2函数库实现验证码功能示例
2019/01/27 PHP
KindEditor在php环境下上传图片功能集成的方法示例
2020/07/20 PHP
一个JavaScript操作元素定位元素的实例
2014/10/29 Javascript
AngularJS基础知识
2014/12/21 Javascript
15个jquery常用方法、小技巧分享
2015/01/13 Javascript
基于jQuery实现仿百度首页选项卡切换效果
2016/05/29 Javascript
JavaScript中return用法示例
2016/11/29 Javascript
Vue指令的钩子函数使用方法
2017/03/20 Javascript
bootstrap多层模态框滚动条消失的问题
2017/07/21 Javascript
nodejs爬虫初试superagent和cheerio
2018/03/05 NodeJs
JavaScript使用递归和循环实现阶乘的实例代码
2018/08/28 Javascript
Vue实现页面添加水印功能
2019/11/09 Javascript
一篇文章带你从零快速上手Rollup
2020/09/07 Javascript
[02:17]2016国际邀请赛中国区预选赛VG战队领队采访
2016/06/26 DOTA
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
对python:循环定义多个变量的实例详解
2019/01/20 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
2019/02/22 Python
python-tornado的接口用swagger进行包装的实例
2019/08/29 Python
Python输出指定字符串的方法
2020/02/06 Python
意大利综合购物网站:Giordano Shop
2016/10/21 全球购物
琳达·法罗眼镜英国官网:Linda Farrow英国
2021/01/19 全球购物
材料化学应届生求职信
2013/10/09 职场文书
护士见习期自我鉴定
2014/02/08 职场文书
公司开业庆典策划方案
2014/06/04 职场文书
委托书英文
2015/01/28 职场文书
如何写新闻稿
2015/07/18 职场文书
你会写请假条吗?
2019/06/26 职场文书
让人瞬间清醒的句子,句句经典,字字如金
2019/07/08 职场文书
美甲店的创业计划书模板
2019/08/23 职场文书
css中:last-child不生效的解决方法
2022/08/05 HTML / CSS