解决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将xml xsl文件生成html文件存储示例讲解
Dec 03 Python
python线程锁(thread)学习示例
Dec 04 Python
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
Jun 10 Python
Python两个内置函数 locals 和globals(学习笔记)
Aug 28 Python
Python实现合并两个列表的方法分析
May 28 Python
对python 判断数字是否小于0的方法详解
Jan 26 Python
Django模型序列化返回自然主键值示例代码
Jun 12 Python
在cmd中查看python的安装路径方法
Jul 03 Python
python基于Selenium的web自动化框架
Jul 14 Python
Python定时任务APScheduler原理及实例解析
May 30 Python
opencv 图像滤波(均值,方框,高斯,中值)
Jul 08 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
Jan 11 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 empty() 检查一个变量是否为空
2011/11/10 PHP
PHP统计二维数组元素个数的方法
2013/11/12 PHP
php实现的九九乘法口诀表简洁版
2014/07/28 PHP
JS实现可改变列宽的table实例
2013/07/02 Javascript
js通过八个点 拖动改变div大小的实现方法
2014/03/05 Javascript
用JavaScript实现一个代码简洁、逻辑不复杂的多级树
2014/05/23 Javascript
jQuery移除元素自动解绑事件实现思路及代码
2014/05/31 Javascript
javascript将数字转换整数金额大写的方法
2015/01/27 Javascript
JQuery的ON()方法支持的所有事件罗列
2015/02/28 Javascript
jQuery实现文本展开收缩特效
2015/06/03 Javascript
JavaScript中getUTCMinutes()方法的使用详解
2015/06/10 Javascript
基于JavaScript怎么实现让歌词滚动播放
2015/11/03 Javascript
使用JSON作为函数的参数的优缺点
2016/10/27 Javascript
解决前端跨域问题方案汇总
2016/11/20 Javascript
遍历json获得数据的几种方法小结
2017/01/21 Javascript
基于JavaScript实现本地图片预览
2017/02/08 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
2017/07/27 Javascript
分享vue.js devtools遇到一系列问题
2017/10/24 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
2017/12/16 Javascript
vue项目引入字体.ttf的方法
2018/09/28 Javascript
JS在Array数组中按指定位置删除或添加元素对象方法示例
2019/11/19 Javascript
解决VantUI popup 弹窗不弹出或无蒙层的问题
2020/11/03 Javascript
Python使用百度API上传文件到百度网盘代码分享
2014/11/08 Python
SQLite3中文编码 Python的实现
2017/01/11 Python
python利用拉链法实现字典方法示例
2017/03/25 Python
Python批量更改文件名的实现方法
2017/10/29 Python
微信跳一跳python辅助脚本(总结)
2018/01/11 Python
天美时手表加拿大官网:Timex加拿大
2016/09/01 全球购物
StubHub中国:购买和出售全球活动门票
2020/01/01 全球购物
见习期自我鉴定
2013/11/07 职场文书
质量月口号
2014/06/20 职场文书
2014学习优秀共产党员先进事迹思想汇报
2014/09/14 职场文书
个人对照检查材料思想汇报
2014/09/26 职场文书
村主任“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
违反交通安全法检讨书
2014/10/24 职场文书
个人自我鉴定怎么写?
2019/07/01 职场文书