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编程生成随机用户名及密码的方法示例
May 05 Python
安装Python和pygame及相应的环境变量配置(图文教程)
Jun 04 Python
python实现监控某个服务 服务崩溃即发送邮件报告
Jun 21 Python
python让列表倒序输出的实例
Jun 25 Python
python用pandas数据加载、存储与文件格式的实例
Dec 07 Python
对python 通过ssh访问数据库的实例详解
Feb 19 Python
Python CVXOPT模块安装及使用解析
Aug 01 Python
python web框架Flask实现图形验证码及验证码的动态刷新实例
Oct 14 Python
简单了解pytest测试框架setup和tearDown
Apr 14 Python
Python自动化测试基础必备知识点总结
Feb 07 Python
Pytorch中Softmax和LogSoftmax的使用详解
Jun 05 Python
如何在Python中妥善使用进度条详解
Apr 05 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生成静态页面详解
2006/12/05 PHP
php数组函数array_walk用法示例
2016/05/26 PHP
深入理解PHP 数组之count 函数
2016/06/13 PHP
PHP-FPM 的管理和配置详解
2019/02/17 PHP
Laravel5.5 实现后台管理登录的方法(自定义用户表登录)
2019/09/30 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
2020/04/23 PHP
jQuery图片滚动图片的效果(另类实现)
2013/06/02 Javascript
js实现弹出窗口、页面变成灰色并不可操作的例子分享
2014/05/10 Javascript
JS 新增Cookie 取cookie值 删除cookie 举例详解
2014/10/10 Javascript
javascript实现控制的多级下拉菜单
2015/07/05 Javascript
JavaScript小技巧整理
2015/12/30 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
2016/12/18 Javascript
基于BootStrap的前端分页带省略号和上下页效果
2017/05/18 Javascript
微信分享调用jssdk实例
2017/06/08 Javascript
基于复选框demo(分享)
2017/09/27 Javascript
微信小程序实现下载进度条的方法
2017/12/08 Javascript
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
使用typescript构建Vue应用的实现
2019/08/26 Javascript
Typescript的三种运行方式(小结)
2019/09/18 Javascript
原生JS无缝滑动轮播图
2019/10/22 Javascript
javascript使用Blob对象实现的下载文件操作示例
2020/04/18 Javascript
[40:03]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#1EHOME VS Archon
2016/03/02 DOTA
[42:24]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第一场 11.01
2020/11/02 DOTA
python3实现读取chrome浏览器cookie
2016/06/19 Python
python写日志文件操作类与应用示例
2019/07/01 Python
使用Python实现图像标记点的坐标输出功能
2019/08/14 Python
python 申请内存空间,用于创建多维数组的实例
2019/12/02 Python
英国水族馆和池塘用品购物网站:Warehouse Aquatics
2019/08/29 全球购物
在C语言中"指针和数组等价"到底是什么意思?
2014/03/24 面试题
工程现场管理求职自荐信
2013/10/02 职场文书
大学生演讲稿
2014/04/25 职场文书
学生夜不归宿检讨书
2014/09/23 职场文书
初中体育教学随笔
2015/08/15 职场文书
python 实现定时任务的四种方式
2021/04/01 Python
mysql 排序失效
2022/05/20 MySQL
SpringCloud超详细讲解Feign声明式服务调用
2022/06/21 Java/Android