Python 2/3下处理cjk编码的zip文件的方法


Posted in Python onApril 26, 2019

今天项目中遇到了中文编码的zip文件,处理了蛮长时间,所以记录下,以免下次踩坑。

Python2下

Python2中读取zip文件,zipfile.ZipInfo的filename类型是str,基本上类似于python3中的bytes,即可以被decode为unicode。

所以,要处理中文,只需要将文件名按照编码decode成unicode就好。

import zipfile
fpath = '/path/to/zip.zip'
zfile = zipfile.ZipFile(fpath, 'r')
for fileinfo in zfile.filelist:
  print fileinfo.filename.decode('gb18030')
  # 如果要更加详细的区分bytes/str/unicode的语义
  print bytes(fileinfo.filename).decode('gb18030')

Python3下

Python3中,Language encoding flag (EFS)如果是1,则按照utf8来处理文件编码,EFS如果为0,则直接按照cp437解码文件名。这是标准直接规定的。

但是,很多软件在制作zip压缩包的时候,直接使用gb18030或者其他非标准编码格式来编码文件名,所以我们还得将文件名反转为bytes,然后再使用对应的编码方式解码:

fpath = '/path/to/zip.zip'
zfile = zipfile.ZipFile(fpath, 'r')
for fileinfo in zfile.filelist:
  print(fileinfo.filename.encode('cp437').decode('gb18030'))

方法都有了,那直接根据文件名智能猜测文件编码,然后解压就好。但是由于单个文件名太短,chardet的猜测可能不准,所以我们可以直接将所有的文件名连接起来,猜测编码。

代码请参考 mczip ,兼容python2和python3。

总结

以上所述是小编给大家介绍的Python 2/3下处理cjk编码的zip文件的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python单例模式实例分析
Apr 08 Python
一篇文章入门Python生态系统(Python新手入门指导)
Dec 11 Python
Python基于Logistic回归建模计算某银行在降低贷款拖欠率的数据示例
Jan 23 Python
Django-Model数据库操作(增删改查、连表结构)详解
Jul 17 Python
Python BeautifulSoup [解决方法] TypeError: list indices must be integers or slices, not str
Aug 07 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
Nov 07 Python
Python selenium的基本使用方法分析
Dec 21 Python
Python基础之字典常见操作经典实例详解
Feb 26 Python
Python使用Paramiko控制liunx第三方库
May 20 Python
python实现一个简单RPC框架的示例
Oct 28 Python
解决pytorch读取自制数据集出现过的问题
May 31 Python
Opencv实现二维直方图的计算及绘制
Jul 21 Python
实例详解Matlab 与 Python 的区别
Apr 26 #Python
Python生成MD5值的两种方法实例分析
Apr 26 #Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
Apr 26 #Python
Python生成rsa密钥对操作示例
Apr 26 #Python
python利用Opencv实现人脸识别功能
Apr 25 #Python
Python OpenCV利用笔记本摄像头实现人脸检测
Aug 20 #Python
python使用KNN算法识别手写数字
Apr 25 #Python
You might like
要会喝咖啡也要会知道咖啡豆
2021/03/03 咖啡文化
php Http_Template_IT类库进行模板替换
2009/03/19 PHP
PHP中new static() 和 new self() 的区别介绍
2015/01/09 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
2015/04/17 PHP
php的crc32函数使用时需要注意的问题(不然就是坑)
2015/04/21 PHP
Symfony控制层深入详解
2016/03/17 PHP
js中window.open打开一个新的页面
2014/08/10 Javascript
JavaScript italics方法入门实例(把字符串显示为斜体)
2014/10/17 Javascript
JavaScript中常见获取元素的方法汇总
2015/03/04 Javascript
jQuery实现的多级下拉菜单效果代码
2015/08/24 Javascript
javascript作用域、作用域链(菜鸟必看)
2016/06/16 Javascript
微信小程序 合法域名校验出错详解及解决办法
2017/03/09 Javascript
Vue.js在使用中的一些注意知识点
2017/04/29 Javascript
js如何获取网页所有图片
2017/05/12 Javascript
vue开发调试神器vue-devtools使用详解
2017/07/13 Javascript
使用vue-cli编写vue插件的方法
2018/02/26 Javascript
Javascript中parseInt的正确使用方式
2018/10/17 Javascript
详解async/await 异步应用的常用场景
2019/05/13 Javascript
[35:44]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG
2014/05/26 DOTA
[15:35]教你分分钟做大人:天怒法师
2014/10/30 DOTA
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
Python字符串的encode与decode研究心得乱码问题解决方法
2009/03/23 Python
在Python中处理列表之reverse()方法的使用教程
2015/05/21 Python
Python lxml模块安装教程
2015/06/02 Python
python常用函数详解
2016/09/13 Python
python爬虫_实现校园网自动重连脚本的教程
2018/04/22 Python
Python实现图片拼接的代码
2018/07/02 Python
在Keras中CNN联合LSTM进行分类实例
2020/06/29 Python
css3使用animation属性实现炫酷效果(推荐)
2020/02/04 HTML / CSS
幼儿园园长自我鉴定
2013/10/22 职场文书
机械设计及其自动化求职推荐信
2014/02/17 职场文书
党员四风剖析材料
2014/08/27 职场文书
党的群众路线对照检查材料范文
2014/09/24 职场文书
2015年党员岗位承诺书
2015/04/27 职场文书
2017公司年会主持人开幕词
2016/03/04 职场文书
一文带你探究MySQL中的NULL
2021/11/11 MySQL