解决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多行字符串拼接使用小括号的方法

多行字符串拼接使用小括号 s = ('select *' 'from atable' 'where id=888') print s, type(s) #输出 select...

python编程-将Python程序转化为可执行程序[整理]

工欲善其事,必先利其器.python是解释型的语言,但是在windows下如果要执行程序的话还得加个python shell的话,未免也太麻烦了.而这里所说的东西就是将pytho...

Django处理文件上传File Uploads的实例

HttpRequest.FILES 表单上传的文件对象存储在类字典对象request.FILES中,表单格式需为multipart/form-data <form enctyp...

详解Python的Django框架中inclusion_tag的使用

另外一类常用的模板标签是通过渲染 其他 模板显示数据的。 比如说,Django的后台管理界面,它使用了自定义的模板标签来显示新增/编辑表单页面下部的按钮。 那些按钮看起来总是一样的,但是...

Python入门篇之文件

Python入门篇之文件

文件处理的函数和方法 使用Open()函数可打开文件,语法格式如下: 复制代码 代码如下: file_handler = open(filename,[,mode[,bufsize]]...