解决python3中解压zip文件是文件名乱码的问题


Posted in Python onMarch 22, 2018

在zip标准中,对文件名的 encoding 用的不是 unicode,而可能是各种软件根据系统的默认字符集来采用(此为猜测),因此zipfile中根据文件 flag 检测的时候,只支持 cp437 和 utf-8。

具体就是查找 zipfile.py 源代码找到下面的代码:

1: if flags & 0x800:
2: # UTF-8 file names extension
3: filename = filename.decode('utf-8')
4: else:
5: # Historical ZIP filename encoding
6: filename = filename.decode('cp437')

可见编码被正确识别为utf8时的情况外,都会被识别并decode为cp437编码,但如果实际是gbk等其他编码时就变为乱码了。所以解决的方法在于被decode为cp437后重新再手动转为正确的编码。

具体代码如下:

#修改代码
if flags & 0x800:
 # UTF-8 file names extension
 filename = filename.decode('utf-8')
else:
 # Historical ZIP filename encoding
 filename = filename.decode('cp437')
 #修改
 filename = filename.encode("cp437").decode('gbk')

后面一处同样如此修改

if zinfo.flag_bits & 0x800:
 # UTF-8 filename
 fname_str = fname.decode("utf-8")
else:
 fname_str = fname.decode("cp437")
 #修改
 fname_str = fname_str.encode("cp437").decode('gbk')

亲测有效!

以上这篇解决python3中解压zip文件是文件名乱码的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现将目录中TXT合并成一个大TXT文件的方法
Jul 15 Python
使用Python操作excel文件的实例代码
Oct 15 Python
Python二叉树的定义及常用遍历算法分析
Nov 24 Python
numpy中以文本的方式存储以及读取数据方法
Jun 04 Python
用python生成1000个txt文件的方法
Oct 25 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
Jan 22 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
Jul 22 Python
通过 Django Pagination 实现简单分页功能
Nov 11 Python
python科学计算之numpy——ufunc函数用法
Nov 25 Python
Python itertools.product方法代码实例
Mar 27 Python
python安装sklearn模块的方法详解
Nov 28 Python
Django 用户认证Auth组件的使用
Nov 30 Python
Python爬虫工程师面试问题总结
Mar 22 #Python
Python入门必须知道的11个知识点
Mar 21 #Python
python使用Tesseract库识别验证
Mar 21 #Python
python如何派生内置不可变类型并修改实例化行为
Mar 21 #Python
python如何通过实例方法名字调用方法
Mar 21 #Python
python如何为被装饰的函数保留元数据
Mar 21 #Python
15行Python代码带你轻松理解令牌桶算法
Mar 21 #Python
You might like
php自定义函数转换html标签示例
2016/09/29 PHP
jQuery EasyUI 开源插件套装 完全替代ExtJS
2010/03/24 Javascript
JavaScript高级程序设计 DOM学习笔记
2011/09/10 Javascript
node.js超时timeout详解
2014/11/26 Javascript
JavaScript实现的经典文件树菜单效果
2015/09/08 Javascript
javascript中call apply 与 bind方法详解
2016/03/10 Javascript
基于javascript实现九宫格大转盘效果
2020/05/28 Javascript
NodeJs读取JSON文件格式化时的注意事项
2016/09/25 NodeJs
JS获取年月日时分秒的方法分析
2016/11/28 Javascript
实例解析jQuery中如何取消后续执行内容
2016/12/01 Javascript
Javascript中字符串和数字的操作方法整理
2017/01/22 Javascript
bootstrap 模态框(modal)实现水平垂直居中显示
2017/01/23 Javascript
jquery实现的table排序功能示例
2017/03/10 Javascript
利用Node.js对文件进行重命名
2017/03/12 Javascript
利用yarn代替npm管理前端项目模块依赖的方法详解
2017/09/04 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
2017/12/16 Javascript
JS/HTML5游戏常用算法之追踪算法实例详解
2018/12/12 Javascript
koa router 多文件引入的方法示例
2019/05/22 Javascript
javascript实现电商放大镜效果
2020/11/23 Javascript
python统计字符串中指定字符出现次数的方法
2015/04/04 Python
浅析Python的Django框架中的Memcached
2015/07/23 Python
Python编码爬坑指南(必看)
2016/06/10 Python
Linux下为不同版本python安装第三方库
2016/08/31 Python
Python3.5.3下配置opencv3.2.0的操作方法
2018/04/02 Python
使用python对excle和json互相转换的示例
2018/10/23 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
2018/12/05 Python
Django实现发送邮件找回密码功能
2019/08/12 Python
初学者学习Python好还是Java好
2020/05/26 Python
AmazeUI 列表的实现示例
2020/08/17 HTML / CSS
美国领先的宠物用品和宠物食品零售商:Petco
2020/10/28 全球购物
struct和class的区别
2015/11/20 面试题
对照检查剖析材料
2014/09/30 职场文书
2014年销售内勤工作总结
2014/12/01 职场文书
《扇形统计图》教学反思
2016/02/17 职场文书
公文写作:教你写“建议书”
2019/05/07 职场文书
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python