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字符串,数值计算
Oct 05 Python
Python内置函数—vars的具体使用方法
Dec 04 Python
python3处理含有中文的url方法
May 10 Python
python 对dataframe下面的值进行大规模赋值方法
Jun 09 Python
Python实现带下标索引的遍历操作示例
May 30 Python
Python创建或生成列表的操作方法
Jun 19 Python
django框架自定义模板标签(template tag)操作示例
Jun 24 Python
Pytorch在NLP中的简单应用详解
Jan 08 Python
python中线程和进程有何区别
Jun 17 Python
Python字符串的15个基本操作(小结)
Feb 03 Python
90行Python代码开发个人云盘应用
Apr 20 Python
python读取mat文件生成h5文件的实现
Jul 15 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
浅析is_writable的php实现
2013/06/18 PHP
php实现html标签闭合检测与修复方法
2015/07/09 PHP
PHP基于ORM方式操作MySQL数据库实例
2017/06/21 PHP
PHP children()函数讲解
2019/02/03 PHP
php5对象复制、clone、浅复制与深复制实例详解
2019/08/14 PHP
php进程(线程)通信基础之System V共享内存简单实例分析
2019/11/09 PHP
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
2010/12/08 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
2014/10/17 Javascript
详解微信小程序——自定义圆形进度条
2016/12/29 Javascript
JS实现的邮箱提示补全效果示例
2018/01/30 Javascript
在vue中使用echarts图表实例代码详解
2018/10/22 Javascript
vue中使用mxgraph的方法实例代码详解
2019/05/17 Javascript
微信小程序绘制图片发送朋友圈
2019/07/25 Javascript
js获取本日、本周、本月的时间代码
2020/02/01 Javascript
JS内置对象和Math对象知识点详解
2020/04/03 Javascript
jQuery实现本地存储
2020/12/22 jQuery
python 获取文件列表(或是目录例表)
2009/03/25 Python
使用Python的内建模块collections的教程
2015/04/28 Python
django主动抛出403异常的方法详解
2019/01/04 Python
Python Multiprocessing多进程 使用tqdm显示进度条的实现
2019/08/13 Python
NumPy中的维度Axis详解
2019/11/26 Python
tensorflow安装成功import tensorflow 出现问题
2020/04/16 Python
浅谈Python中的字符串
2020/06/10 Python
python raise的基本使用
2020/09/10 Python
pyqt5实现井字棋的示例代码
2020/12/07 Python
英国知名的皮手套品牌:Dents
2016/11/13 全球购物
一套C#面试题
2013/10/09 面试题
网络教育自我鉴定
2013/11/01 职场文书
体育专业自荐书
2014/05/29 职场文书
干部作风整顿自我剖析材料和整改措施
2014/09/18 职场文书
区政府领导班子个人对照检查材料
2014/09/25 职场文书
领导干部作风建设工作总结
2014/10/23 职场文书
2014年帮扶工作总结
2014/11/26 职场文书
优秀员工事迹材料
2014/12/20 职场文书
如何利用STAR法则制作留学文书?
2019/08/26 职场文书
MySQL数据库实验实现简单数据库应用系统设计
2022/06/21 MySQL