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 07 Python
Python进阶之尾递归的用法实例
Jan 31 Python
解决python3 网络请求路径包含中文的问题
May 10 Python
tensorflow实现简单的卷积神经网络
May 24 Python
Python实现的txt文件去重功能示例
Jul 07 Python
Python实现二维曲线拟合的方法
Dec 29 Python
postman模拟访问具有Session的post请求方法
Jul 15 Python
python 协程 gevent原理与用法分析
Nov 22 Python
Python实现微信好友的数据分析
Dec 16 Python
linux 下python多线程递归复制文件夹及文件夹中的文件
Jan 02 Python
如何在keras中添加自己的优化器(如adam等)
Jun 19 Python
Python 实现PS滤镜中的径向模糊特效
Dec 03 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
合作指挥官:孟斯克
2020/03/16 星际争霸
php设计模式 Interpreter(解释器模式)
2011/06/26 PHP
深入浅析php中sprintf与printf函数的用法及区别
2016/01/08 PHP
基于laravel制作APP接口(API)
2016/03/15 PHP
php反射学习之依赖注入示例
2019/06/14 PHP
extJs 常用到的增,删,改,查操作代码
2009/12/28 Javascript
Javascript学习笔记1 数据类型
2010/01/11 Javascript
javascript 正则替换 replace(regExp, function)用法
2010/05/22 Javascript
js与jquery中获取当前鼠标的x、y坐标位置的代码
2011/05/23 Javascript
把字符串按照特定的字母顺序进行排序的js代码
2014/01/28 Javascript
排序算法的javascript实现与讲解(99js手记)
2014/09/28 Javascript
JavaScript通过Date-Mask将日期转换成字符串的方法
2015/06/04 Javascript
Jquery easyui 实现动态树
2015/11/17 Javascript
jQuery EasyUI提交表单验证
2016/07/19 Javascript
js 实现省市区三级联动菜单效果
2017/02/20 Javascript
Vue render函数实战之实现tabs选项卡组件
2019/04/22 Javascript
微信小程序获取复选框全选反选选中的值(实例代码)
2019/12/17 Javascript
从零开始在vue-cli4配置自适应vw布局的实现
2020/06/08 Javascript
[01:03:27]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python中的闭包详细介绍和实例
2014/11/21 Python
Django 路由系统URLconf的使用
2018/10/11 Python
python递归法解决棋盘分割问题
2019/07/17 Python
关于Python形参打包与解包小技巧分享
2019/08/24 Python
浅谈sklearn中predict与predict_proba区别
2020/06/28 Python
python打包生成so文件的实现
2020/10/30 Python
python 基于wx实现音乐播放
2020/11/24 Python
详解Pycharm第三方库的安装及使用方法
2020/12/29 Python
手把手教你用Django执行原生SQL的方法
2021/02/18 Python
html5跨域通讯之postMessage的用法总结
2013/11/07 HTML / CSS
在HTML5 Canvas中放入图片和保存为图片的方法
2014/05/03 HTML / CSS
幼儿园三八妇女节活动方案
2014/03/11 职场文书
党课心得体会范文
2014/09/09 职场文书
个人贷款授权委托书样本
2014/10/07 职场文书
工作表扬信范文
2015/01/17 职场文书
JavaScript实现贪吃蛇游戏
2021/06/16 Javascript
JavaScript组合继承详解
2021/11/07 Javascript