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

yipeiwu_com6年前Python基础

在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查看微信好友是否删除自己

本文实例为大家分享了python微信好友删除的具体代码,供大家参考,具体内容如下 #weixin.py #coding:utf-8 # !/usr/bin/env python #...

Python numpy实现数组合并实例(vstack,hstack)

若干个数组可以沿不同的轴合合并到一起,vstack,hstack的简单用法, >>> a = np.floor(10*np.random.random((2,2))...

python numpy数组复制使用实例解析

这篇文章主要介绍了python numpy数组复制使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在使用python时我们...

python画图——实现在图上标注上具体数值的方法

python画图——实现在图上标注上具体数值的方法

比如当前的表格数据是 df['resultRate'].plot(style='-.bo') plt.grid(axis='y') #设置数字标签** for a,b in zi...

Python3实现的画图及加载图片动画效果示例

Python3实现的画图及加载图片动画效果示例

本文实例讲述了Python3实现的画图及加载图片动画效果。分享给大家供大家参考,具体如下: #__*__coding:utf-8__*__ #python3 import time...