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爬虫之使用urllib2组件抓取网页内容
Nov 04 Python
Python实现购物程序思路及代码
Jul 24 Python
遗传算法之Python实现代码
Oct 10 Python
python微信公众号之关键词自动回复
Jun 15 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
Aug 07 Python
Python实现简单查找最长子串功能示例
Feb 26 Python
局域网内python socket实现windows与linux间的消息传送
Apr 19 Python
Python 变量的创建过程详解
Sep 02 Python
Python 爬取必应壁纸的实例讲解
Feb 24 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
Feb 28 Python
详细分析Python collections工具库
Jul 16 Python
python实现图片转换成素描和漫画格式
Aug 19 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
正则表达式语法
2006/10/09 Javascript
关于mysql 字段的那个点为是定界符
2007/01/15 PHP
分享十款最出色的PHP安全开发库中文详细介绍
2015/03/22 PHP
curl和libcurl的区别简介
2015/07/01 PHP
PHP+Session防止表单重复提交的解决方法
2018/04/09 PHP
Laravel 5.4前后台分离,通过不同的二级域名访问方法
2019/10/13 PHP
jQuery 1.0.4 - New Wave Javascript(js源文件)
2007/01/15 Javascript
document.documentElement和document.body区别介绍
2013/09/16 Javascript
文本域中换行符的替换示例
2014/03/04 Javascript
对比分析json及XML
2014/11/28 Javascript
js如何判断输入字符串长度
2015/12/16 Javascript
js操作cookie保存浏览记录的方法
2015/12/25 Javascript
js+css简单实现网页换肤效果
2015/12/29 Javascript
jQuery实现的鼠标滑过弹出放大图片特效
2016/01/08 Javascript
Vue.js组件tabs实现选项卡切换效果
2016/12/01 Javascript
js将字符串中的每一个单词的首字母变为大写其余均为小写
2017/01/05 Javascript
JavaScript省市级联下拉菜单实例
2017/02/14 Javascript
Underscore之Array_动力节点Java学院整理
2017/07/10 Javascript
javascript 跨域问题以及解决办法
2017/07/17 Javascript
小程序Request的另类用法详解
2019/08/09 Javascript
[02:04]2016国际邀请赛中国区预选赛VG.R晋级之路
2016/07/01 DOTA
[01:06]DOTA2小知识课堂 Ep.01 TP出门不要忘记帮队友灌瓶哦
2019/12/05 DOTA
Python 数据结构之堆栈实例代码
2017/01/22 Python
解决django后台样式丢失,css资源加载失败的问题
2019/06/11 Python
python列表推导式入门学习解析
2019/12/02 Python
keras自定义损失函数并且模型加载的写法介绍
2020/06/15 Python
豪华床上用品、床单和浴室必需品:Peacock Alley
2019/09/04 全球购物
北京振戎融通Java面试题
2015/09/03 面试题
动物学专业毕业生求职信
2013/10/11 职场文书
建筑设计师岗位职责
2013/11/18 职场文书
机电一体化毕业生自荐信
2014/06/19 职场文书
出纳试用期自我评价
2015/03/10 职场文书
李强优秀员工观后感
2015/06/16 职场文书
《神奇的鸟岛》教学反思
2016/02/22 职场文书
2019年最新版见习人员管理制度!
2019/07/08 职场文书
python geopandas读取、创建shapefile文件的方法
2021/06/29 Python