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 相关文章推荐
深入理解NumPy简明教程---数组2
Dec 17 Python
使用python对excle和json互相转换的示例
Oct 23 Python
Python发展简史 Python来历
May 14 Python
利用pyuic5将ui文件转换为py文件的方法
Jun 19 Python
Python GUI学习之登录系统界面篇
Aug 21 Python
使用python实现回文数的四种方法小结
Nov 24 Python
Python爬取阿拉丁统计信息过程图解
May 12 Python
python为什么会环境变量设置不成功
Jun 23 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
Nov 17 Python
Python 爬取淘宝商品信息栏目的实现
Feb 06 Python
利用python Pandas实现批量拆分Excel与合并Excel
May 23 Python
Python如何导出导入所有依赖包详解
Jun 08 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
十天学会php(1)
2006/10/09 PHP
PHP 伪静态隐藏传递参数名的四种方法
2010/02/22 PHP
PHP代码实现表单数据验证类
2015/07/28 PHP
CI框架常用经典操作类总结(路由,伪静态,分页,session,验证码等)
2016/11/21 PHP
javascript getElementsByClassName 和js取地址栏参数
2010/01/02 Javascript
js遍历、动态的添加数据的小例子
2013/06/22 Javascript
extjs 分页使用jsp传递数据示例
2014/07/29 Javascript
学习使用bootstrap3栅格系统
2016/04/12 Javascript
你不需要jQuery(三) 新AJAX方法fetch()
2016/06/14 Javascript
基于Bootstrap框架实现图片切换
2017/03/10 Javascript
js 中rewrap-ajax.js插件实例代码
2017/10/20 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
2017/12/09 Javascript
vue cli构建的项目中请求代理与项目打包问题
2018/02/26 Javascript
NVM安装nodejs的方法实用步骤
2019/01/16 NodeJs
vue实现日历备忘录功能
2020/09/24 Javascript
[07:40]DOTA2每周TOP10 精彩击杀集锦vol.4
2014/06/25 DOTA
Python中的Numeric包和Numarray包使用教程
2015/04/13 Python
python numpy函数中的linspace创建等差数列详解
2017/10/13 Python
Python 模拟员工信息数据库操作的实例
2017/10/23 Python
对pandas中时间窗函数rolling的使用详解
2018/11/28 Python
python科学计算之numpy——ufunc函数用法
2019/11/25 Python
python pyecharts 实现一个文件绘制多张图
2020/05/13 Python
python mysql中in参数化说明
2020/06/05 Python
django前端页面下拉选择框默认值设置方式
2020/08/09 Python
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
配置管理计划的主要内容有哪些
2014/06/20 面试题
大学校园生活自我鉴定
2014/01/13 职场文书
酒店行政人事部经理职务说明书
2014/02/26 职场文书
家长对孩子的评语
2014/04/18 职场文书
书香校园建设方案
2014/05/02 职场文书
基层党建工作宣传标语
2014/06/24 职场文书
2014普法依法治理工作总结
2014/12/18 职场文书
教师年度考核个人总结
2015/02/12 职场文书
地雷战观后感
2015/06/09 职场文书
详解Go语言运用广度优先搜索走迷宫
2021/06/23 Python
Redis分布式锁Redlock的实现
2021/08/07 Redis