当前位置: 首页 > news >正文

python 循环解压 解压多重压缩包

在实际数据中,经常会有压缩包套压缩包的情况,并且有可能出现“zip”压缩包下面套“tar”的可能。

你可以运行后面的代码,来完成自动解压。代码会不断检查folder_a_path 文件夹下是否还有压缩包。目前支持zip、rar、tar、7z等四种格式的压缩文件。

你需要使用pycharm等工具,将zipfile源码中的“cp437”改成“gbk”,不然解压中文时会出乱码。共有两处需要修改的zipfile源码,修改后的结果如下:

            if fheader[_FH_GENERAL_PURPOSE_FLAG_BITS] & 0x800:# UTF-8 filenamefname_str = fname.decode("utf-8")else:fname_str = fname.decode("gbk")
            if flags & 0x800:# UTF-8 file names extensionfilename = filename.decode('utf-8')else:# Historical ZIP filename encodingfilename = filename.decode('gbk')

完整的代码代码如下:

import os
import tarfile
import patoolib
import zipfile
import py7zrdef extract_archive(archive_path, extract_path):"""解压缩指定路径的压缩包到指定目录。"""if archive_path.endswith(".zip"):with zipfile.ZipFile(archive_path, 'r') as zip_ref:zip_ref.extractall(extract_path)elif archive_path.endswith(".tar"):with tarfile.open(archive_path, 'r') as tar_ref:tar_ref.extractall(extract_path)elif archive_path.endswith(".7z"):with py7zr.SevenZipFile(archive_path, mode='r') as sz_ref:sz_ref.extractall(extract_path)elif archive_path.endswith(".rar"):patoolib.extract_archive(archive_path,outdir=extract_path)def extract_all_archives(folder_path):"""解压文件夹中的所有压缩包,直到文件夹中没有压缩包为止。"""flag=Falsefor root, dirs, files in os.walk(folder_path):for file in files:file_path = os.path.join(root, file)if file_path.endswith((".zip", ".tar", ".7z", ".rar")):temp_extract_path = os.path.join(root, file_path[0:file_path.rindex(".")])if not os.path.exists(temp_extract_path):print(f"【发现压缩包】{file_path}")flag=Trueos.makedirs(temp_extract_path,exist_ok=True)extract_archive(file_path, temp_extract_path)return flagif __name__=="__main__":"""直接处理文件夹,多次执行主函数,直至没有输出为止    """folder_a_path = r'C:\xxx\xxx'contains_unzip_file=Truewhile contains_unzip_file:contains_unzip_file=extract_all_archives(folder_a_path)
http://www.lryc.cn/news/290503.html

相关文章:

  • 基于C#制作一个连连看小游戏
  • Android-System 根据包名查找已安装应用apk方法
  • 洛谷-P4124题-手机号码-Java
  • 仅使用 Python 创建的 Web 应用程序(前端版本)第08章_商品详细
  • Stable Diffusion 长视频真人动画风格互转
  • 精要图示:园区金融数字化服务蓝图,以园区为支点推动信贷业务增长
  • 2024 中国(南京)国际口腔设备器械博览会
  • 【MyBatis】快速入门MyBatis(保姆式教学),你值得一看
  • git pull代码时候报错:error: cannot open .git/FETCH_HEAD: Permission denied
  • shell - 正则表达式和grep命令和sed命令
  • datawhale 大模型学习 第十二章-大模型环境影响
  • Qt WebEngine模块使用(开发环境安装和程序开发)
  • 网络体系结构 和网络原理之UDP和TCP
  • 将Android APP安装到sm8550 HDK的NVMe SSD
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • Linux:进度条的创建
  • treeview
  • Android开发中自定义View实现RecyclerView下划线
  • MySQL前百分之N问题--percent_rank()函数
  • 【高效开发工具系列】Wolfram Alpha
  • 分享7种SQL的进阶用法
  • protobuf-go pragma.go 文件介绍
  • C#设置程序开机启动
  • 爱可声助听器参与南湖区价值百万公益助残捐赠活动成功举行
  • SpringBoot 实现定时任务
  • 将Vue2中的console.log调试信息移除
  • EMC设计检查建议,让PCB layout达到最佳性能
  • 常用抓包软件集合(Fiddler、Charles)
  • C++入门(一)— 使用VScode开发简介
  • PeakCAN连接到WSL2 Debian