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 相关文章推荐
linux下安装easy_install的方法
Feb 10 Python
Python实现分割文件及合并文件的方法
Jul 10 Python
使用Python脚本实现批量网站存活检测遇到问题及解决方法
Oct 11 Python
Python实现翻转数组功能示例
Jan 12 Python
tensorflow输出权重值和偏差的方法
Feb 10 Python
python生成tensorflow输入输出的图像格式的方法
Feb 12 Python
python3下实现搜狗AI API的代码示例
Apr 10 Python
Python的互斥锁与信号量详解
Sep 12 Python
Python字典底层实现原理详解
Dec 18 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
Jun 15 Python
如何利用pycharm进行代码更新比较
Nov 04 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
Dec 01 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中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
php中异常处理方法小结
2015/01/09 PHP
php数组使用规则分析
2015/02/27 PHP
利用PHP生成CSV文件简单示例
2016/12/21 PHP
关于Curl在Swoole协程中的解决方案详析
2019/09/12 PHP
js下弹出窗口的变通
2007/04/18 Javascript
input、button的不同type值在ajax提交表单时导致的陷阱
2009/02/24 Javascript
jquery 最简单易用的表单验证插件
2010/02/27 Javascript
弹出窗口并且此窗口带有半透明的遮罩层效果
2014/03/13 Javascript
浅析javascript中的DOM
2015/03/01 Javascript
js实现div层缓慢收缩与展开的方法
2015/05/11 Javascript
浅谈JavaScript中指针和地址
2015/07/26 Javascript
JS给Textarea文本框添加行号的方法
2015/08/20 Javascript
javascript设计模式之单体模式学习笔记
2017/02/15 Javascript
Node.js中.pfx后缀文件的处理方法
2017/03/10 Javascript
VueJS事件处理器v-on的使用方法
2017/09/27 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
vue 项目如何引入微信sdk接口的方法
2017/12/18 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
Vue组件基础用法详解
2020/02/05 Javascript
快速解决Vue、element-ui的resetFields()方法重置表单无效的问题
2020/08/12 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
Linux下用Python脚本监控目录变化代码分享
2015/05/21 Python
python中模块查找的原理与方法详解
2017/08/11 Python
pandas数据预处理之dataframe的groupby操作方法
2018/04/13 Python
python 带时区的日期格式化操作
2020/10/23 Python
可以随进度显示不同颜色的css3进度条分享
2014/04/11 HTML / CSS
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
Tom Dixon官网:英国照明及家具设计和制造公司
2019/03/01 全球购物
房地产财务管理制度
2014/02/02 职场文书
奠基仪式策划方案
2014/05/15 职场文书
2014年城管工作总结
2014/11/20 职场文书
用电申请报告范文
2015/05/18 职场文书
基层医务人员三严三实心得体会
2016/01/05 职场文书
如何使用 resize 实现图片切换预览功能
2021/08/23 HTML / CSS
JS 4个超级实用的小技巧 提升开发效率
2021/10/05 Javascript