Python批量解压&压缩文件夹的示例代码


Posted in Python onApril 04, 2022

一、python批量解压

提示:如果是重要数据解压前请先备份,解压后会覆盖原压缩文件!!

解压前:

Python批量解压&压缩文件夹的示例代码

解压后:文件名为英文:

Python批量解压&压缩文件夹的示例代码

文件名中包含中文:

Python批量解压&压缩文件夹的示例代码

代码如下

import os
import shutil
import zipfile
 
# 首先引入需要的工具包
# shutil为后期移动文件所需,可以忽略此项 
# 路径改这里!
#parent_path = r'输入路径,会解压该路径下的所有zip压缩文件'
parent_path = r'E:\py\python3.7\test\test99\zip' 
# 文件类型选择
# 可以自行更改压缩文件类型,需要引入其它工具包,如tarfile等
# 这里是因为在自己的windows上,zip比较常见,其他类型请自行更改
file_flag = '.zip'   #修改需解压的格式 例如:.rar
# 删除已解压的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批量压缩

压缩前:

Python批量解压&压缩文件夹的示例代码

压缩后:

Python批量解压&压缩文件夹的示例代码

代码如下:

import zipfile
import os

def zip_yasuo(start_dir):
    file_news = start_dir + '.zip'
    if not os.path.isfile(file_news):
        z = zipfile.ZipFile(file_news, 'w', zipfile.ZIP_DEFLATED)
        for dir_path, dir_names, file_names in os.walk(start_dir):
            file_path = dir_path.replace(start_dir, '')
            file_path = file_path and file_path + os.sep or ''
            for filename in file_names:
                z.write(os.path.join(dir_path, filename), file_path+filename)
        z.close()

if __name__ == "__main__":
    base_path = r"E:\py\python3.7\test\test99\zip"
    base_path_list = os.listdir(base_path)
    for base_path_list_one in base_path_list:
        base_path_list_one_dir = os.path.join(base_path,base_path_list_one)
        # 子目录
        print("准备压缩需要压缩的子目录", base_path_list_one_dir)
        if os.path.isdir(base_path_list_one_dir):
            zip_yasuo(base_path_list_one_dir)

到此这篇关于Python批量解压&压缩文件夹的示例代码的文章就介绍到这了,更多相关Python解压 压缩文件夹内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python内建模块struct实例详解
Feb 02 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
Nov 06 Python
python使用原始套接字发送二层包(链路层帧)的方法
Jul 22 Python
python list转置和前后反转的例子
Aug 26 Python
在Python中实现函数重载的示例代码
Dec 12 Python
Python实现CAN报文转换工具教程
May 05 Python
Python 字典中的所有方法及用法
Jun 10 Python
Django限制API访问频率常用方法解析
Oct 12 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
Feb 02 Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
Mar 03 Python
聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
Mar 03 Python
OpenCV-Python模板匹配人眼的实例
Jun 08 Python
Python调用腾讯API实现人脸身份证比对功能
Python字符串常规操作小结
Anaconda安装pytorch和paddle的方法步骤
python lambda 表达式形式分析
PyTorch device与cuda.device用法
Apr 03 #Python
Python实现为PDF去除水印的示例代码
Apr 03 #Python
Python实现文字pdf转换图片pdf效果
Apr 03 #Python
You might like
php实现简单的语法高亮函数实例分析
2015/04/27 PHP
php 数据结构之链表队列
2017/10/17 PHP
PHP+Session防止表单重复提交的解决方法
2018/04/09 PHP
php中curl和soap方式请求服务超时问题的解决
2018/06/11 PHP
php从数据库读取数据,并以json格式返回数据的方法
2018/08/21 PHP
php原生数据库分页的代码实例
2019/02/18 PHP
微信推送功能实现方式图文详解
2019/07/12 PHP
编写跨浏览器的javascript代码必备[js多浏览器兼容写法]
2008/10/29 Javascript
javascript学习笔记(十) js对象 继承
2012/06/19 Javascript
两个select多选模式的选项相互移动(示例代码)
2014/01/11 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
2014/03/12 Javascript
JavaScript及jquey实现多个数组的合并操作
2014/09/06 Javascript
浅析函数声明和函数表达式——函数声明的声明提前
2016/05/03 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(二)之数据支持json字符串、list集合
2016/08/11 Javascript
windows 下安装nodejs 环境变量设置
2017/02/02 NodeJs
详解用node.js实现简单的反向代理
2017/06/26 Javascript
jQuery层级选择器_动力节点节点Java学院整理
2017/07/04 jQuery
vue实现登陆登出的实现示例
2017/09/15 Javascript
用vue封装插件并发布到npm的方法步骤
2017/10/18 Javascript
浅谈Node.js 沙箱环境
2018/05/15 Javascript
配置一个vue3.0项目的完整步骤
2019/04/26 Javascript
微信小程序实现下滑到底部自动翻页功能
2020/03/07 Javascript
[54:10]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
Python中优化NumPy包使用性能的教程
2015/04/23 Python
python对配置文件.ini进行增删改查操作的方法示例
2017/07/28 Python
python处理csv中的空值方法
2018/06/22 Python
Mac在python3环境下安装virtualwrapper遇到的问题及解决方法
2019/07/09 Python
python3文件复制、延迟文件复制任务的实现方法
2019/09/02 Python
世界排名第一的万圣节服装店:Spirit Halloween
2018/10/16 全球购物
经贸专业毕业生求职信
2014/03/23 职场文书
小学生暑假家长评语
2014/04/17 职场文书
学生党员公开承诺书
2014/05/28 职场文书
世界遗产的导游词
2015/02/13 职场文书
建筑安全员岗位职责
2015/02/15 职场文书
2016年3月份红领巾广播稿
2015/12/21 职场文书
Python之Matplotlib绘制热力图和面积图
2022/04/13 Python