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使用分治法实现求解最大值的方法
May 12 Python
解析Python中的生成器及其与迭代器的差异
Jun 20 Python
python selenium 对浏览器标签页进行关闭和切换的方法
May 21 Python
Python加载带有注释的Json文件实例
May 23 Python
解决python中 f.write写入中文出错的问题
Oct 31 Python
python 批量添加的button 使用同一点击事件的方法
Jul 17 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
Feb 17 Python
一文了解python 3 字符串格式化 F-string 用法
Mar 04 Python
如何利用Python 进行边缘检测
Oct 14 Python
Python使用grequests并发发送请求的示例
Nov 05 Python
基于Python爬取搜狐证券股票过程解析
Nov 18 Python
pytorch 中autograd.grad()函数的用法说明
May 12 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
php 购物车的例子
2009/05/04 PHP
fetchAll()与mysql_fetch_array()的区别详解
2013/06/05 PHP
PHP echo()函数讲解
2019/02/15 PHP
JavaScript Event学习第十章 一些可替换的事件对
2010/02/10 Javascript
JavaScript 更严格的相等 [译]
2012/09/20 Javascript
javascript操作JSON的要领总结
2012/12/09 Javascript
抛弃Nginx使用nodejs做反向代理服务器
2014/07/17 NodeJs
JavaScript中的document.referrer在各种浏览器测试结果
2014/07/18 Javascript
jquery实现保存已选用户
2014/07/21 Javascript
json属性名为什么要双引号(个人猜测)
2014/07/31 Javascript
node.js中的fs.existsSync方法使用说明
2014/12/17 Javascript
javascript制作的滑动图片菜单
2015/05/15 Javascript
用svg制作富有动态的tooltip
2015/07/17 Javascript
学习JavaScript设计模式之状态模式
2016/01/08 Javascript
谈一谈JS消息机制和事件机制的理解
2016/04/14 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
2016/05/17 Javascript
详解handlebars+require基本使用方法
2016/12/21 Javascript
js自定义弹框插件的封装
2020/08/24 Javascript
react+ant design实现Table的增、删、改的示例代码
2018/12/27 Javascript
Vue项目引发的「过滤器」使用教程
2019/03/12 Javascript
JavaScript设计模式之门面模式原理与实现方法分析
2020/03/09 Javascript
通过mod_python配置运行在Apache上的Django框架
2015/07/22 Python
对pandas中apply函数的用法详解
2018/04/10 Python
在dataframe两列日期相减并且得到具体的月数实例
2018/07/03 Python
Python实现监控键盘鼠标操作示例【基于pyHook与pythoncom模块】
2018/09/04 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
2018/11/14 Python
在Django下测试与调试REST API的方法详解
2019/08/29 Python
基于tf.shape(tensor)和tensor.shape()的区别说明
2020/06/30 Python
Python自动化操作实现图例绘制
2020/07/09 Python
Python语言编写智力问答小游戏功能
2020/10/13 Python
公共汽车、火车和飞机票的通用在线预订和销售平台:INFOBUS
2019/11/30 全球购物
仓库管理制度
2014/01/21 职场文书
刊首寄语大全
2014/04/11 职场文书
群众路线剖析材料怎么写
2014/10/09 职场文书
介绍信格式样本
2015/05/05 职场文书
师德培训心得体会2016
2016/01/09 职场文书