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使用点操作符访问字典(dict)数据的方法
Mar 16 Python
python图像处理之反色实现方法
May 30 Python
python基础知识小结之集合
Nov 25 Python
python cx_Oracle模块的安装和使用详细介绍
Feb 13 Python
python对于requests的封装方法详解
Jan 03 Python
python+mysql实现教务管理系统
Feb 20 Python
python3实现指定目录下文件sha256及文件大小统计
Feb 25 Python
python把1变成01的步骤总结
Feb 27 Python
详解Python 解压缩文件
Apr 09 Python
Python如何使用turtle库绘制图形
Feb 26 Python
Python+Pillow+Pytesseract实现验证码识别
May 11 Python
Python软件包安装的三种常见方法
Jul 07 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
无刷新动态加载数据 滚动条加载适合评论等页面
2013/10/16 PHP
是 WordPress 让 PHP 更流行了 而不是框架
2016/02/03 PHP
PHP中静态变量的使用方法实例分析
2016/12/01 PHP
thinkPHP5.0框架引入Traits功能实例分析
2017/03/18 PHP
javascript基础第一章 JavaScript与用户端
2010/07/22 Javascript
Jquery getJSON方法详细分析
2013/12/26 Javascript
动态加载js的方法汇总
2015/02/13 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
JS实现兼容各种浏览器的高级拖动方法完整实例【测试可用】
2016/06/21 Javascript
微信小程序 实例应用(记账)详解
2016/09/28 Javascript
JS 对java返回的json格式的数据处理方法
2016/12/05 Javascript
js微信分享实现代码
2020/10/11 Javascript
jQuery选择器之子元素选择器详解
2017/09/18 jQuery
nodejs发送http请求时遇到404长时间未响应的解决方法
2017/12/10 NodeJs
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
2018/09/15 Javascript
详解javascript void(0)
2020/07/13 Javascript
[05:53]敌法师的金色冠名ID"BurNIng",是传说,是荣耀
2020/07/11 DOTA
python判断、获取一张图片主色调的2个实例
2014/04/10 Python
在python中的socket模块使用代理实例
2014/05/29 Python
基于Python中单例模式的几种实现方式及优化详解
2018/01/09 Python
在numpy矩阵中令小于0的元素改为0的实例
2019/01/26 Python
python仿抖音表白神器
2019/04/08 Python
python小程序实现刷票功能详解
2019/07/17 Python
python如何导出微信公众号文章方法详解
2020/08/31 Python
python实现简单猜单词游戏
2020/12/24 Python
基于Python实现天天酷跑功能
2021/01/06 Python
C&A巴西网上商店:时尚、衣服、手机和鞋子
2020/06/07 全球购物
自我鉴定范文
2013/11/10 职场文书
大学生创业计划书的格式要求
2013/12/29 职场文书
2014年十一国庆向国旗敬礼寄语
2014/04/11 职场文书
机械工程学院大学生求职信
2014/05/25 职场文书
横空出世观后感
2015/06/09 职场文书
和谐拯救危机观后感
2015/06/15 职场文书
保护环境的宣传语
2015/07/13 职场文书
使用RedisTemplat实现简单的分布式锁
2021/11/20 Redis
中国十大神话动漫电影排行榜 哪吒登顶 白蛇缘起排第七
2022/03/21 国漫