查看原文
其他

zipfile(二)

数据分析团队 Stata and Python数据分析 2022-03-15

本文作者:胡   婧

文字编辑:宁刘莹

技术总编:张   邯


在之前的文章Zipfile(一)中,介绍了zipfile.ZipFile的相关内容,本期推文小编将继续介绍zipfile.ZipInfo这个类,然后讲解一个综合案例,并且分享一个实战中遇到的乱码问题的解决方法。


一、zipfile. ZipInfo

zipfile.ZipInfo可以通过zipfile.ZipFilegetinfo()方法和infolist()方法返回得到,表示压缩文件中某指定文件的相关信息。我们先使用temp.zip压缩包当中的zipfile.docx文件创建一个ZipInfo对象a

In [1]: import zipfileIn [2]: z=zipfile.ZipFile("D:/temp.zip",'r')In [3]: a=z.getinfo('zipfile.docx')


       然后可以查看这个文件的相关信息:

In [4]: print(a.filename) #文件名称Out[5]: zipfile.docxIn [6]: print(a.date_time) #最后修改时间Out[6]: (2019, 9, 29, 13, 48, 8) #返回一个元组,依次表示年、月、日、时、分、秒。In [7]: print(a.compress_type) #压缩类型Out[7]: 8In [8]: print(a.comment) #文档说明Out[8]: b''In [9]: print(a.compress_size) #获取压缩后的文件大小Out[9]: 194488In [10]: print(a.file_size)#未压缩的文件大小Out[10]: 245725


根据以上内容,我们可以知道这个文件的名称叫zipfile.docx,最后的修改时间是201992913:48:8,文件大小245725字节,压缩后变成194488字节,和下图信息一致:


二、综合案例

日常工作中,经常会批量下载大量数据,使用完之后归纳存档可以使用zipfile进行压缩包处理,例如我们想要将从民政部官网上爬取的2017-2019年的各省份民政统计数据整理至一个压缩包中。全部程序如下所示:

import zipfileimport osos.chdir('D:/民政统计分省数据')with zipfile.ZipFile("D:/民政统计分省数据.zip",'w') as z: for file in os.listdir():        z.write(file)

根据上图,可以看出我们已将2017-2019年各省份的民政统计数据文件压缩至了D盘的名为“民政统计分省数据”的压缩包中。


三、解决乱码问题

在测试的过程中,发现当压缩文件中手动添加的文件包含中文名时,解压缩时文件名会出现乱码的情况。这是因为在zipfile模块中,将所有非utf-8编码都默认为cp437编码,所以对于使用GB18030编码的文件名就会变成乱码。正常解压缩程序如下:

In [24]: import osIn [25]: import zipfileIn [26]: z=zipfile.ZipFile("D:/temp.zip",'r')In [27]: for a in z.namelist():    z.extract(a,'D:/temp')

我们发现文件名称出现中文乱码。这里给出一种解决方法:在解压缩后先用cp437编码,再用GB18030解码,具体程序如下:

In [28]: for a in z.namelist(): b=a.encode('cp437').decode('gb18030') z.extract(a,'D:/temp') os.chdir('D:/temp') os.rename(a,b)

这样,中文就可以正常显示啦。以上便是zipfile模块的常用方法,希望可以对大家以后的文件处理有所帮助。^_^



对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐

利用collapse命令转化原始数据

Stata中的数值型

爬虫实战——聚募网股权众筹信息爬取

duplicates drop之前,我们要做什么?

类型内置函数-type() isinstance()

数据含义记不住?—— label“大神”来帮忙

实战演练-如何获取众筹项目的团队信息

Zipfile(一)

tabplot命令

Jupyter Notebook不为人知的秘密

字符串方法(三)

数据,我要“拷打”你

encode 和decode——带你探索编码与解码的世界
字符串方法(二)
如何快速生成分组变量?
用Stata实现数据标准化
Stata16新功能之“框架”——frlink连接多个数据集(3)
Stata16新功能之“框架”——基础命令大合集(2)

关于我们

微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存