python批量解压zip文件的方法


Posted in Python onAugust 20, 2019

这是一个用python写解压大量zip脚本的说明,本人新手一个,希望能对各位有所启发。

首先要注意的,在运行自己的脚本之前一定先备份或者复制出一些样本进行测试,不然出错会很麻烦;

之后我用到的是解压zip文件的扩展包zipfile,可以直接pip安装或者在IDE里安装,需要特别注意的是这个包的文件名解码方式需要我们去修改,先去查看源文件,直接搜索“cp437”(一个编码方式),找到后全部替换为“gbk”,即可解决中文显示问题。

代码:

import os
import shutil
import zipfile
# 首先引入需要的工具包
# shutil为后期移动文件所需,可以忽略此项
# 路径改这里!
parent_path = r'输入路径,会解压该路径下的所有zip压缩文件'
# 文件类型选择
# 可以自行更改压缩文件类型,需要引入其它工具包,如tarfile等
# 这里是因为在自己的windows上,zip比较常见,其他类型请自行更改
file_flag = '.zip'
# 删除已解压的zip文件
# 不建议初次使用,在确定程序无误后可以添加使用
def del_old_zip(file_path):
  os.remove(file_path)
# 解压
def decompress(file_path, root):
  # 开始
  # zipfile打开zip文件
  z = zipfile.ZipFile(f'{file_path}', 'r')
  # 解压
  z.extractall(path=f"{root}")  # path为解压路径,解包后位于该路径下
  # 判断是否需要重复解包
  for names in z.namelist():
    if names.endswith(file_flag):
      z.close()
      return 1
  # 结束
  z.close()
  return 0
# 因为我在使用过程中发现有些zip解包后会混在一起
# 在平时大家手动解压时可能也会遇到提示是否覆盖的问题
# 下面的两个函数解决这一问题
# 开始要先创建一个大文件夹 与压缩包名字相同
# 避免后期混乱和麻烦
def start_dir_make(root, dirname):
  os.chdir(root)
  os.mkdir(dirname)
  return os.path.join(root, dirname)
# 去除多余文件夹
def rem_dir_extra(root, father_dir_name):
  # 递归要注意信息的正常处理 搞不好上一个调用已经改变了东西 而下面的调用还是使用之前的数据
  try:
    # 判断文件夹重名 开始
    for item in os.listdir(os.path.join(root, father_dir_name)):
      # 第一步判断是不是一个文件夹,如果不是则跳过本次循环
      if not os.path.isdir(os.path.join(root, father_dir_name, item)):
        continue
      # 判断是否要脱掉一层目录结构
      # 文件夹名字要相同,且子目录中只有单独的一个文件夹
      if item == father_dir_name and len(
          os.listdir(os.path.join(root, father_dir_name))) == 1:
        # 改变工作目录
        os.chdir(root)
        # 将无用文件夹重命名,因为直接移动会有重名错误
        os.rename(father_dir_name, father_dir_name + '-old')
        # 移动文件后删除空文件夹
        shutil.move(os.path.join(root, father_dir_name + '-old', item), os.path.join(root))
        os.rmdir(os.path.join(root, father_dir_name + '-old'))
        # 将去掉一层目录结构后的文件夹继续作为父本递归处理下去
        # 这里要注意,上面已经发生过数据的改动,所以下面递归传参一定要正确!
        rem_dir_extra(root, item)
      else:
        # 处理那些不满足上面条件的文件夹
        rem_dir_extra(os.path.join(root, father_dir_name), item)
  except Exception as e:
    # 打印错误信息
    print("清除文件夹出错" + str(e))
# 入口
if __name__ == '__main__':
  flag = 1
  while flag:
    # 循环遍历文件夹
    for root, dirs, files in os.walk(parent_path):
      # 读取文件名
      for name in files:
        if name.endswith(file_flag):
          # 创建文件夹
          new_ws = start_dir_make(root, name.replace(file_flag, ''))
          # zip文件地址
          zip_path = os.path.join(root, name)
          # 解压
          flag = decompress(zip_path, new_ws)
          # 删除解压后的文件
          # 有点危险
          # 但不删除又可能会重复运行
           # 一定要备份或先测试,不然可能会凉,自己选择修改
          del_old_zip(zip_path)
          # 去掉多余的文件结构
          rem_dir_extra(root, name.replace(file_flag, ''))
          print(f'{root}\\{name}'.join(['文件:', '\n解压完成\n']))
  # 由于解压可能解了好几次 所以可能会有已经解压好的父级目录重名无法处理 这里要再处理一次
  rem_dir_extra(os.path.split(parent_path)[0], os.path.split(parent_path)[1])
  print("解压完成啦,记得检查有没有zip格式之外的呀!\n\n其他格式需要自己改一下了")

总结

以上所述是小编给大家介绍的python批量解压zip文件的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Python 相关文章推荐
微信跳一跳python辅助脚本(总结)
Jan 11 Python
flask入门之文件上传与邮件发送示例
Jul 18 Python
使用python脚本实现查询火车票工具
Jul 19 Python
python实现逐个读取txt字符并修改
Dec 24 Python
Python3中函数参数传递方式实例详解
May 05 Python
Python安装与基本数据类型教程详解
May 29 Python
python实现批量处理将图片粘贴到另一张图片上并保存
Dec 12 Python
利用python实现凯撒密码加解密功能
Mar 31 Python
Python virtualenv虚拟环境实现过程解析
Apr 18 Python
python如何运行js语句
Sep 09 Python
python时间time模块处理大全
Oct 25 Python
python+requests实现接口测试的完整步骤
Oct 27 Python
pytorch获取vgg16-feature层输出的例子
Aug 20 #Python
python 并发编程 非阻塞IO模型原理解析
Aug 20 #Python
Python实现某论坛自动签到功能
Aug 20 #Python
python函数的作用域及关键字详解
Aug 20 #Python
pytorch 可视化feature map的示例代码
Aug 20 #Python
python爬虫 基于requests模块的get请求实现详解
Aug 20 #Python
python爬虫 urllib模块url编码处理详解
Aug 20 #Python
You might like
dede全站URL静态化改造[070414更正]
2007/04/17 PHP
php标签云的实现代码
2012/10/10 PHP
php设置编码格式的方法
2013/03/05 PHP
php字符编码转换之gb2312转为utf8
2013/10/28 PHP
使用PHP备份MySQL和网站发送到邮箱实例代码
2013/11/28 PHP
一组PHP可逆加密解密算法实例代码
2014/01/21 PHP
php将session放入memcached的设置方法
2014/02/14 PHP
php switch语句多个值匹配同一代码块的实现
2014/03/03 PHP
php自动提交表单的方法(基于fsockopen与curl)
2016/05/09 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
2017/02/08 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
tp5(thinkPHP5)框架连接数据库的方法示例
2018/12/24 PHP
jquery创建div 实现代码
2009/04/27 Javascript
jquery 应用代码 方便的排序功能
2010/02/06 Javascript
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
2012/02/27 Javascript
JQUERY实现左侧TIPS滑进滑出效果示例
2013/06/27 Javascript
详解在Vue中通过自定义指令获取dom元素
2017/03/04 Javascript
JavaScript自定义文本框光标
2017/03/05 Javascript
实例分析nodejs模块xml2js解析xml过程中遇到的坑
2017/03/18 NodeJs
Vue2.0实现1.0的搜索过滤器功能实例代码
2017/03/20 Javascript
jQuery自定义元素右键点击事件(实现案例)
2017/04/28 jQuery
Vue引入sass并配置全局变量的方法
2018/06/27 Javascript
Vue仿微信app页面跳转动画效果
2019/08/21 Javascript
JS数组的高级使用方法示例小结
2020/03/14 Javascript
[01:00:04]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第二局
2016/02/26 DOTA
python模拟登陆Tom邮箱示例分享
2014/01/13 Python
纯python实现机器学习之kNN算法示例
2018/03/01 Python
python 通过字符串调用对象属性或方法的实例讲解
2018/04/21 Python
anaconda中更改python版本的方法步骤
2019/07/14 Python
python 并发下载器实现方法示例
2019/11/22 Python
Python 实现opencv所使用的图片格式与 base64 转换
2020/01/09 Python
全网最全python库selenium自动化使用详细教程
2021/01/12 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
金融行业务员的自我评价
2013/12/13 职场文书
2015年领导干部廉洁自律工作总结
2015/05/26 职场文书
python生成可执行exe控制Microsip自动填写号码并拨打功能
2021/06/21 Python