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实现简单EXCEL数据统计的实例
Jan 24 Python
Python实现抓取HTML网页并以PDF文件形式保存的方法
May 08 Python
python 实现批量xls文件转csv文件的方法
Oct 23 Python
详解Python进阶之切片的误区与高级用法
Dec 24 Python
Python 限制线程的最大数量的方法(Semaphore)
Feb 22 Python
Python实现的对一个数进行因式分解操作示例
Jun 27 Python
使用Pandas对数据进行筛选和排序的实现
Jul 29 Python
使用遗传算法求二元函数的最小值
Feb 11 Python
13个Pandas实用技巧,助你提高开发效率
Aug 19 Python
Python2及Python3如何实现兼容切换
Sep 01 Python
利用python为PostgreSQL的表自动添加分区
Jan 18 Python
Django中session进行权限管理的使用
Jul 09 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代码
2010/08/08 PHP
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
2014/06/19 PHP
php同时使用session和cookie来保存用户登录信息的实现代码
2016/05/13 PHP
CL vs ForZe BO5 第五场 2.13
2021/03/10 DOTA
对setInterval在火狐和chrome切换标签产生奇怪的效果之探索,与解决方案!
2011/10/29 Javascript
Jquery修改页面标题title其它JS失效的解决方法
2014/10/31 Javascript
关于编写性能高效的javascript事件的技术
2014/11/28 Javascript
JS实现淡入淡出图片效果的方法分析
2016/12/20 Javascript
ES6中module模块化开发实例浅析
2017/04/06 Javascript
基于JS代码实现简单易用的倒计时 x 天 x 时 x 分 x 秒效果
2017/07/13 Javascript
初探JavaScript 面向对象(推荐)
2017/09/03 Javascript
解决Vue使用mint-ui loadmore实现上拉加载与下拉刷新出现一个页面使用多个上拉加载后冲突问题
2017/11/07 Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
2018/06/19 Javascript
vue.js仿hover效果的实现方法示例
2019/01/28 Javascript
Node 搭建一个静态资源服务器的实现
2019/05/20 Javascript
详解vue页面首次加载缓慢原因及解决方案
2019/11/06 Javascript
javascript实现简易计算器功能
2020/09/23 Javascript
为什么推荐使用JSX开发Vue3
2020/12/28 Vue.js
[01:16:16]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第二场 1月8日
2021/03/11 DOTA
CSS3实现复选框动画特效示例代码
2016/09/27 HTML / CSS
美国婚礼装饰和活动用品批发供应商:Event Decor Direct
2018/10/12 全球购物
高中毕业自我鉴定范文
2013/10/02 职场文书
商业计算机应用专业自荐书
2014/06/09 职场文书
自动化专业毕业生求职信
2014/06/18 职场文书
房地产资料员岗位职责
2014/07/02 职场文书
自愿离婚协议书范文2014
2014/10/12 职场文书
服务承诺书
2015/01/19 职场文书
党支部评议意见
2015/06/02 职场文书
千手观音观后感
2015/06/03 职场文书
钱学森电影观后感
2015/06/04 职场文书
2015年学校医务室工作总结
2015/07/20 职场文书
军训后的感想
2015/08/07 职场文书
MySQL 隔离数据列和前缀索引的使用总结
2021/05/14 MySQL
Python MNIST手写体识别详解与试练
2021/11/07 Python
JavaScript实现优先级队列
2021/12/06 Javascript
Python实现聚类K-means算法详解
2022/07/15 Python