解决Python复杂zip文件的解压问题
作者:Python_xiaowu 发布时间:2021-08-11 05:04:09
标签:Python,zip文件,解压
废话不多说,直接看问题,使用过 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, '解压测试')
可以看到,效果完美 :
来源:https://blog.csdn.net/Python_xiaowu/article/details/121858175


猜你喜欢
- MySQL事务处理(TransAction)思考了很久,决定写一篇关于mysql事务(transaction)的博客,一来嘛,因为最近在复习
- 本文实例讲述了Python实现多并发访问网站功能。分享给大家供大家参考,具体如下:# Filename:visitweb_threads.p
- 本文实例讲述了python实现web方式logview的方法。分享给大家供大家参考。具体如下:这里用Python实现web方式查看日志的一个
- 前言:说到JavaScript中的继承,与之密切相关的就是原型链了,JavaScript中的继承主要是通过原型链实现的。但是简单的原型链继承
- 为了提高工作效率(偷懒),用python去解决。工作需要,需要将excel文件转化为csv文件,要是手工的一个个去转换,每个sheet页不但
- 模块是用类编写的,只有一个StringIO类,所以它的可用方法都在类中。此类中的大部分函数都与对文件的操作方法类似。例:#coding=gb
- 详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别os._exit() 和
- 1.变量命名1)命名的规范性变量名可以包括字母、数字、下划线,但是数字不能做为开头。系统关键字不能做变量名使用除了下划线之个,其它符号不能做
- 利用MySQLfs这个工具,我么可以在MySQL关系数据库中存储文件系统。MySQLfs将文件系统中文件的字节内容分解成数据库中的元组,而数
- 本文说明向外扩展数据库系统的两个选项,从而实现更高的可扩展性:水平数据划分和垂直数据划分当我提到向外扩展数据库系统时,我实际上只是讨论对数据
- 1、在给客户系统巡检时通过rman维护日志发现有rman维护日志报错:RMAN-06207: WARNING: 3 objects coul
- 一、环境配置需要 pillow 和 pytesseract 这两个库,pip install 安装就好了。install pillow -i
- 这个东西很重要,可以经常用在项目当中,所以我们单独拿出来进行讲解。在使用它之前我们需要导包: go get golang.org/
- 1. 安装Anaconda3官网下载Anaconda3:https://www.anaconda.com/distribution/运行下载
- 系统存储过程,sp_executesql 语言在这里! sp_executesql 执行可以多次重用或动
- 对很多从事产品工作的同事来说,“以用户为中心”是工作的重点,同时也是难点。用户的心思难以捉摸,用户研究的工作也似乎高深莫测。不过,用户研究并
- hello,我是小小炽,这是我写的第一篇博客,写博客一直都想在写,但是苦于能力尚浅,在各位大牛面前那既然是关公面前耍大刀了,但是其实想来每一
- 提到序列化与反序列化,通常会想到 json ,xml .在J2EE的开发中,这是很常用的技术,比如一个java class与xml之间的序列
- 本文实例讲述了Python框架Flask的基本数据库操作方法。分享给大家供大家参考,具体如下:数据库操作在web开发中扮演着一个很重要的角色
- python实现情感分析(Word2Vec)** 前几天跟着老师做了几个项目,老师写的时候劈里啪啦一顿敲,写了个啥咱也布吉岛,线下自己就瞎琢