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递归删除指定目录及其所有内容的方法
Jan 13 Python
Python多进程multiprocessing用法实例分析
Aug 18 Python
解决Python3中的中文字符编码的问题
Jul 18 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
Aug 10 Python
Python中创建二维数组
Oct 17 Python
如何使用django的MTV开发模式返回一个网页
Jul 22 Python
python 三元运算符使用解析
Sep 16 Python
详解Python3定时器任务代码
Sep 23 Python
python开发前景如何
Jun 11 Python
Python3开发环境搭建详细教程
Jun 18 Python
Python自动创建Excel并获取内容
Sep 16 Python
Python中的套接字编程是什么?
Jun 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
使用PHP编写的SVN类
2013/07/18 PHP
php判断一个数组是否为有序的方法
2015/03/27 PHP
PHP图像处理类库及演示分享
2015/05/17 PHP
PHP数组生成XML格式数据的封装类实例
2016/11/10 PHP
详谈PHP面向对象中常用的关键字和魔术方法
2017/02/04 PHP
php使用crypt()函数进行加密
2017/06/08 PHP
详解如何在云服务器上部署Laravel
2017/06/30 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
2006/10/17 Javascript
一段多浏览器的"复制到剪贴板"javascript代码
2007/03/27 Javascript
jQuery的remove()方法使用详解
2015/08/11 Javascript
vue的Virtual Dom实现snabbdom解密
2017/05/03 Javascript
利用vue组件自定义v-model实现一个Tab组件方法示例
2017/12/06 Javascript
vue使用$emit时,父组件无法监听到子组件的事件实例
2018/02/26 Javascript
Angular Renderer (渲染器)的具体使用
2018/05/03 Javascript
vue兄弟组件传递数据的实例
2018/09/06 Javascript
VUE实现Studio管理后台之鼠标拖放改变窗口大小
2020/03/04 Javascript
vue element table中自定义一些input的验证操作
2020/07/18 Javascript
详解Django中的过滤器
2015/07/16 Python
python解决汉字编码问题:Unicode Decode Error
2017/01/19 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
Python configparser模块配置文件过程解析
2020/03/03 Python
Python实现猜年龄游戏代码实例
2020/03/25 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
音频处理 windows10下python三方库librosa安装教程
2020/06/20 Python
python map比for循环快在哪
2020/09/21 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
CSS3实现歌词进度文字颜色填充变化动态效果的思路详解
2020/06/02 HTML / CSS
HTML5中使用postMessage实现两个网页间传递数据
2016/06/22 HTML / CSS
家庭户外服装:Hawkshead
2017/11/02 全球购物
SQL SERVER面试资料
2013/03/30 面试题
生产部统计员岗位职责
2014/01/05 职场文书
深入开展党的群众路线教育实践活动方案
2014/02/04 职场文书
孝敬父母的活动方案
2014/08/28 职场文书
党员四风问题对照检查材料思想汇报
2014/09/16 职场文书
老干部工作汇报材料
2014/10/28 职场文书