废话不多说,直接看问题,使用过 Python 中的标准库 zipfile 解压过 zip 格式压缩包的朋友们,可能遇到过,当压缩文件中的目录或文件名中包含中文等常见 unicode 字符时,典型如下面的例子:

使用 zipfile 的 extract() 或 extractall() 方法直接解压时,产生的解压结果名充斥着乱码,这一点我们通过调用 namelist() 方法就可以看出来:

from zipfile import ZipFile# 读入压缩包文件
file = ZipFile('示例压缩包.zip')# 查看压缩包内目录、文件名称
file.namelist()

这是因为 zipfile 中针对压缩包内容的编码兼容性差,但我们可以通过下面的函数自行矫正:

def recode(raw: str) -> str:'''编码修正'''try:return raw.encode('cp437').decode('gbk')except:return raw.encode('utf-8').decode('utf-8')for file_or_path in file.namelist():print(file_or_path, ' -------> ' , recode(file_or_path))

解决了文件名乱码的问题后,接下来我们就可以配合 shutil 与 os 标准库中的相关功能,实现将指定任意 zip 压缩包,完好地解压到指定的目录中,代码如下:

def zip_extract_all(src_zip_file: ZipFile, target_path: str) -> None:# 遍历压缩包内所有内容for file_or_path in file.namelist():# 若当前节点是文件夹if file_or_path.endswith('/'):try:# 基于当前文件夹节点创建多层文件夹os.makedirs(os.path.join(target_path, recode(file_or_path)))except FileExistsError:# 若已存在则跳过创建过程pass# 否则视作文件进行写出else:# 利用shutil.copyfileobj,从压缩包io流中提取目标文件内容写出到目标路径with open(os.path.join(target_path, recode(file_or_path)), 'wb') as z:# 这里基于Zipfile.open()提取文件内容时需要使用原始的乱码文件名shutil.copyfileobj(src_zip_file.open(file_or_path), z)# 向已存在的指定文件夹完整解压当前读入的zip文件
zip_extract_all(file, '解压测试')

可以看到,效果完美 :

Python实用秘技,复杂zip文件的解压相关推荐

  1. ZIP文件夹解压小程序

    第1关:ZIP文件夹解压小程序之文件压缩 任务描述 相关知识 编程要求 测试说明 任务描述 本关任务:实现压缩文件或文件夹的功能. 相关知识 ZIP 是一种较为常见的压缩形式,在 Java 中要想实现 ...

  2. Java实现Zip文件的解压和压缩_ZipUtil

    这是一个关于Java的zip文件的解压和压缩工具类,里面除了解压和压缩还有删除.copy等其他功能. 在Java开发中,经常会遇到上传下载,有可能就会遇到解压,于是我就封装了工具类,方便使用. 在本文 ...

  3. 压缩包下载后php文件怎么打开,用户下载的压缩包rar格式或zip文件如何解压 解压后就可以安装或运行里面的文件了...

    狸窝网盘中分享有很多解决方案中使用到的软件资源,下载到电脑后是一个软件的文件压缩包,有的用户下载后不知道如何解压或说解压不了,怎么办?由于狸窝所面向用户比较大众化,为方便不同年龄层次和新手的使用,这里 ...

  4. android下zip压缩文件加密解密的完美解决方案,Android之zip文件加密解压及进度条的实现...

    zip文件的解压可以使用java的zip库,但是没有实现对加密文件的解压功能,这里可以使用zip4j来实现.具体可以参看该文<Android下zip压缩文件加密解密的完美解决方案 http:// ...

  5. iOS如何处理zip文件,解压或者压缩?

    在iOS开发中,我们有时会碰到解压Zip文件,或者压缩成Zip文件的需求! ZipArchive是一个开源的工具包,以下是配置步骤: 1. 首先下载ZipArchive,下载地址:http://zip ...

  6. 使用java程序下载远程zip文件并解压文件( 带注释解释代码)

    带注释解释代码 package com.zcl.Test;import java.io.*; import java.net.HttpURLConnection; import java.net.So ...

  7. python打包zip文件_python 解压文件,合并文件 打包成zip格式文件 生成MD5值

    #!/usr/bin/env python #_*_encoding:utf-8 # 2018/05/29 #augustyang #2.0 ''' 解压文件,合并文件 打包成zip格式文件 生成MD ...

  8. Python:下载zip文件并解压zip文件数据

    以下载百度地图官方给出的中国各大城市中心经纬度压缩文件( https://mapopen-website-wiki.bj.bcebos.com/static_zip/BaiduMap_cityCent ...

  9. 教你ZIP文件如何解压读取、压缩下载【解答】

    源码如下: 1.zip文件解压读取 import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileuploa ...

最新文章

  1. 部署SAP HANA之前你需要知道的那些事
  2. centos8 kernel source 安装_什么?你在物理机上安装Oracle总失败?那就试试Docker吧
  3. 前端学习(325):javascript历史
  4. 分区和分片的区别_PHP: 分区和分片 - Manual
  5. 遇到error: stray ‘\357’ in program [solution.c]的解决办法
  6. 简洁的c++http协议获取内容(一)
  7. Cocos2d-JS项目之三:使用合图
  8. 微软提出Layout,多模态任务也有预训练模型啦
  9. 大华DVR IPC 常见问题
  10. 腾讯火力全开“吃鸡”:下一个游戏行业风口怎能错过?
  11. 高质量编辑和压缩pdf
  12. 搭建Web服务器建网站的步骤
  13. 通过CE寻找内存基址
  14. 购买的Microsoft Office不小心卸载后重新安装方法
  15. javascript设置颜色值的几种方法
  16. Kubernetes集群安装 gatekeeper
  17. 手撸的一个快递查询系统,竟然阅读量过1.8w
  18. 企业服务大爆发,HR SaaS的机会与挑战
  19. Android自动化测试
  20. pets vs cattle

热门文章

  1. 区块链技术的未来前景与发展趋势
  2. CASIA -HWDB2.0-2.2和OLHWDB2.0-2.2数据集解析
  3. 超算平台安装Anaconda和Tensorflow
  4. java 秒表_JAVA计时器秒表程序代码
  5. Kylin (四) --------- Kylin 4.0 查询引擎
  6. C语言和Java的优缺点
  7. ArrayList添加一个元素的过程(中部插入以及尾部添加)
  8. Cisco(60)——DHCPv6
  9. 手机做了防抓包,如何抓包
  10. 【技术向】VOT中的EAO是如何计算的