查看原文
其他

Zipfile(一)

数据分析中心 Stata and Python数据分析 2022-03-15

本文作者:胡   婧

文字编辑:宁刘莹

技术总编:张   邯


本文将介绍Python中对zip压缩包的处理方法,其中包括查看压缩包中包含的文件信息、将压缩包里的部分或全部文件解压缩至指定路径下以及将某路径下的文件添加至压缩包中。这需要用到Python中内置的zipfile模块。

首先导入zipfile模块:

In [1]: import zipfile

zipfile模块有两个类,分别为:zipfile.ZipFile以及zipfile.ZipInfo


一、zipfile.ZipFile

1.压缩文件的读入

对于压缩文件的读取、编写以及添加可以使用以下方法:


zipfile.ZipFile(file[, mode[, compression[,allowZip64]]])


其中,file指要读取、编写或者添加的压缩文件的路径以及名称。

mode表示打开该压缩文件的方式(包括:“r”“w”“a”),默认为“r“r表示读取该压缩文件,如果我们指定路径下没有该文件就会报错。在“r模式下,只对文件进行读取,不能对文件进行添加或修改;“w”表示创建一份新的压缩文件,如果我们指定路径下已存在同名的压缩文件,则会将原来的压缩文件覆盖掉;“a”表示在原有压缩文件的基础上进行修改以及添加,如果指定的路径下没有该压缩文件则创建一个新的压缩文件。所以当我们想在原有压缩文件的基础上新压缩一些文件进去,只能使用“a”模式,因为使用“w”模式,会把原有的文件统统覆盖掉。

compression表示压缩方式,分别为: zipfile.ZIP_STORED zipfile.ZIP_DEFLATEDzipfile.ZIP_BZIP2以及zipfile.ZIP_LZMA,默认为zipfile.ZIP_STORED。这四种方式是压缩文件的四种方式,本文不做过多解释,通常情况下不需要设置。

当文件超过4GB时需要将allowZip64设置为True,但默认情况就是True,所以,通常也不需要设置。


这里需要注意的是,当我们对压缩文件进行读取、编写或是添加结束后,需要加上file.close()。完整程序如下:

In [1]: z=zipfile.ZipFile("D:/temp.zip",'r')In [2]: print(z)In [3]: z.close()Out[3]: <zipfile.ZipFile filename='D:/temp.zip' mode='r'>


当然,这里也可以使用之前提到过的上下文管理器,与with结合,省去时刻需要小心是否关闭的烦恼。程序如下:

In [5]: with zipfile.ZipFile("D:/temp.zip",'r') as z: print(z)Out[5]: <zipfile.ZipFile filename='D:/temp.zip' mode='r'>


我们想得知压缩包里的具体内容则可以用到如下程序:

In [6]: z. infolist()


其中返回有压缩包内文件详细信息的列表,一个元素描述一个文件,各个信息的具体含义如下表:


可以看到,这个压缩包中共有三个文件,一个pdf文件、一个xlsx文件和一个docx文件,它们都使用deflate的压缩方式。

 

如果想知道zip文档内的相关信息,则使用如下命令:

In [7]: z.printdir()Out[7]: File Name Modified SizeContemporaneous_verification_of_language_evidence_from_management_earnings_forecasts.pdf 2019-08-30 01:22:04 668784timetable.xlsx 2019-08-30 01:22:04 15447zipfile.docx                                   2019-08-30 01:22:04        48065           


其中相关信息的具体含义如下表所示:


也可以只获得压缩文件内的文件名称列表:

In [8]: z.namelist() Out[8]: ['Contemporaneous_verification_of_language_evidence_from_management_earnings_forecasts.pdf', 'timetable.xlsx', 'zipfile.docx']


       使用open方法,可以返回压缩文件内的某一文件的信息列表:

In [9]: z.open('zipfile.docx','r') Out[9]: <zipfile.ZipExtFile name='zipfile.docx' mode='r' compress_type=deflate>


同时,我们可以读取其中的指定文件,并获取该文件的二进制数据:

In [10]: z.read('zipfile.docx')


2.进行解压缩处理

当我们想对压缩文件中的某一个文件进行解压缩时,使用z.extract(),可以指定路径。程序如下:

In [11]: z.extract('zipfile.docx','D:/temp') Out[11]: 'D:\\temp\\zipfile.docx'


如果我们想对压缩文件中的全部文件进行解压缩,则使用z.extractall(),同时也可以对某个指定文件进行解压,只需要在后面加上需要解压的文件名即可。程序如下:

In [12]: z.extractall('D:/temp') #后面可以加文件名,不加的话默认全部


同时需要注意的是,原来路径下存在的同名文件将会被覆盖掉。


3.将文件进行压缩处理

当我们想将文件压缩至指定压缩文件中时,则需用到如下方式,打开该压缩文件的方式应该为“w”或是“a”


z.write(filename[, arcname[, compress_type]])


其中filename为需要进行压缩的文件路径及其名称,arcname为在压缩文件中该文件被命名的名称,compress_type为压缩方式(默认为zipfile.ZIP_STORED)。

In [13]: z=zipfile.ZipFile("D:/temp.zip",'a')In [14]: z.write('D:/temp/temp.txt','temp.txt') Out[14]: C:\Anaconda3\lib\zipfile.py:1349: UserWarning: Duplicate name: 'temp.txt' return self._open_to_write(zinfo, force_zip64=force_zip64)In [15]: z.close()


这时在D盘下的temp.zip中就添加了一个新的temp.txt文件:


本期我们介绍了ZipFile的常用方法,下期我们将会对ZipInfo这个类进行介绍并给出常见的问题解决方案,敬请期待~


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

你还在用 “mkdir”+“cd”创建和切换路径吗?

tabplot命令
Jupyter Notebook不为人知的秘密
字符串方法(三)
数据,我要“拷打”你
花式调用返回值 —— svret与storedresults
encode 和decode——带你探索编码与解码的世界
字符串方法(二)
如何快速生成分组变量?
用Stata实现数据标准化
字符串方法介绍
Jupyter Notebook的使用
Stata16新功能之“框架”——frlink连接多个数据集(3)
Stata16新功能之“框架”——基础命令大合集(2)
三分钟教你读懂Python报错
解析XML文件
命令更新之reg2docx:将回归结果输出到word
命令更新之t2docx——报告分组均值t检验

关于我们

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

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

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

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