暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一文在手,解压无忧:说说用Python解压zip文件那些事儿

语和言 2022-08-13
588


一、引言


分享知识+推广我的Python书


本次分享的是用Python把zip格式的压缩文件解压缩的几种方法。本文将介绍三种解压缩zip文件的方法:

  1. 使用shutil 标准库的unpack_archive对象解压缩

  2. 使用unzip.exe以命令行方式解压缩

  3. 使用zipfile标准库解压缩



二、新书推广

《Python程序设计(基于计算思维和新文科建设)》,ISBN:9787121435577,胡凤国,电子工业出版社,2022年6月。


本书是电子工业出版社在国内较早采用纸质版+电子版的创新图书发行模式的第一次尝试。本书是这套创新图书的纸质版部分,与之内容互补的电子版图书将稍后出版。

本书的内容包含基础篇排错篇两部分:

基础篇介绍Python程序设计的入门知识,共12章,包括:

⑴ Python简介
⑵ Python软件的安装和Python程序运行;
⑶ Python的基本概念(对象、数据类型、表达式、内置函数);
 输入和输出;
⑸ 程序设计的三种基本结构;
⑹ 函数和类;
⑺ 序列操作(列表、元组、集合、字典);
⑻ 字符串;
⑼ 正则表达式;
⑽ 文件读写;
⑾ 目录与文件操作;
⑿ 常用标准库介绍。

排错篇总结初学者常遇到的错误并介绍程序调试方法,包含2章:

⒀ Python错误类型;
⒁ Python代码调试。 

与本书内容互补的电子版图书包含文本篇应用篇两部分:

文本篇:介绍字符集、编码和文本文件读写的知识,包含了对国家规范《通用规范汉字表》8105个汉字当中难以输入和难以显示的汉字的处理。

应用篇:介绍Word、Excel、PPT、PDF、图片等常用办公文件的处理,是大家提高办公和科研效率的好帮手。

本书配套有详细的PPT和教学大纲,还有全部例题的程序代码和绝大部分思考题的程序代码。

本书配套PPT里面还加入了配套电子版图书中的部分内容,比如字符集和编码,不同编码的文本文件的读写,Word、Excel、PPT、PDF等一些常用办公文件的读写。

本书的配套资源可以在电子工业出版社官网下载。

本书的读者对象:

1、大学文科生 可选本书当Python教材或自学Python的参考书。

2、大学理工科学生 可选本书当自学Python的参考书。

3、文科领域的教师、科研人员和研究生
可拿本书当工具书,本书的配套程序会为您节省效率,在当前大数据和新文科的背景下,本书可以为相关领域的量化研究提供技术支持。

4、理工科领域的教师、科研人员和研究生

本书配套的电子版图书中的编码和文本处理知识也可以作为理工科教师和科研人员处理文本数据的参考资料之一,毕竟专门开辟章节介绍国家标准《通用规范汉字表》汉字处理的程序设计图书并不多见。

5、青少年学生
本书有专门的海龟画图章节,有大量的有趣数学题目,可以培养学生的计算思维,适合对编程感兴趣的中小学生阅读,也适合打算让娃参加编程辅导班的家长朋友参考。

本书在各大实体书店和网店均有销售。尤其在电子工业出版社天猫旗舰店销售火爆,月销量100+。京东、天猫、当当的购买渠道如下(可扫码直达购买页面)。








三、使用shutil 标准库的unpack_archive对象解压缩


shutil 标准库提供了 make_archive 和 unpack_archive 这两个对象用于压缩和解压缩zip文件。

关于使用  进行压缩的方法,可以参考本号之前发布的文章:
一文在手,压缩无忧:说说用Python压缩成zip文件那些事儿
这里探讨用 unpack_archive 对象来解压缩的方法。

unpack_archive 的使用格式如下:


unpack_archive(filename, extract_dir=None, format=None)


第一个参数是被解压缩的文件名。


第二个参数是解压之后放到什么目录,这个参数可以没有,如果没有,则解压到当前目录下。


第三个参数是压缩文件的格式,如果不提供,将检查压缩文件格式是否"zip", "tar", "gztar", "bztar", "xztar" 或其它可以识别的格式,如果不能识别是什么格式,则抛出异常。



这段是基本的解压缩代码,功能是把当前目录下的 1.zip 解压到当前目录下。这里的变量 zipfn 表示被解压缩的文件名,我们为它赋值时,可以只有文件名,也可以带相对路径,也可以带绝对路径。


还有一种指定解压缩路径的用法:



上述代码运行后,会把压缩文件解压到指定的目录下,解压缩之后,会保留压缩包内的文件和目录结构不变。指定的解压缩目录可以不存在,解压缩的时候会自动创建这个目录。


unpack_archive 来解压缩,用法简单,但有两个缺点:


第一、不能解压缩带密码的zip压缩文件;


第二、对于某些文件名是中文的zip压缩文件,解压出来之后文件名是乱码。 make_archive创建的压缩文件不存在这种现象,winrar压缩出来的zip文件存在这种现象。



四、使用unzip.exe以命令行方式解压缩

在Windows操作系统中,需要先下载 unzip.exe,下载页面:

http://gnuwin32.sourceforge.net/packages/unzip.htm

在这个页面点击“Binaries”后面的“Zip”链接,就可以下载到一个压缩包。


或者把如下网址直接复制粘贴到浏览器的地址栏,也能下载到同样的压缩包:

http://gnuwin32.sourceforge.net/downlinks/unzip-bin-zip.php

下载得到的压缩包是 unzip-5.51-1-bin.zip 。我们将 unzip-5.51-1-bin.zip 解压缩到合适的目录下,会在 bin 子目录中发现 unzip.exe ,把 unzip.exe  的路径添加到环境变量中,就可以在命令行窗口中使用 unzip.exe来解压缩 zip 文件了。
解压缩命令示例如下(注意下面命理中的 -P 中的 P 是大写字母):

(1)无密码解压缩,解压到当前目录

unzip  ab.zip

(2)无密码解压缩,解压到指定目录

unzip  ab.zip  -d  tmp

(3)有密码解压缩,解压到当前目录

unzip  -P  123456  ab.zip

(4)有密码解压缩,解压到指定目录

unzip  -P  123456  ab.zip  -d  tmp

命令行操作比较简单,但这不是我们的目标,我们的目标是用Python代码来调用 unzip.exe 实现自动解压缩。



五、使用zipfile标准库解压缩


用zipfile解压缩zip文件,我们需要导入两个对象:


    from zipfile import ZipFile, is_zipfile


    其中,is_zipfile可以判断一个文件是否压缩文件,ZipFile可以打开一个zip压缩文件,打开之后后续再进一步操作。


    1、判断是否zip文件


    使用 is_zipfile 不需要打开 zip 文件,直接用文件名去判断就行了。不过,也有误判的时候,因为Word文件也会被判定为zip文件。



    用zipfile标准库去解压缩Word文件,也能解出一堆文件来,但这不是我们所关心的,我们关心的是解压缩真正的zip文件。


    为了判断真正的zip压缩文件,我们可以先检查扩展名是否 .zip ,再用 is_zipfile 判断一下,这样误判的概率就很小了。


    2、解压缩无密码的zip压缩文件


    对于真正的zip文件,最简单的解压缩操作是解压全部内容,程序代码写起来比较简单,如下所示。



    这段代码是把当前目录下的zip文件 1.zip 中的全部内容解压到当前目录。如果是解压到指定目录,我们可以用如下代码:



    这段代码是把当前目录下的 zip 文件 1.zip 中的全部内容解压到当前目录的 temp 子目录下。

    解压压缩文件的全部内容的代码也可以写成如下的形式。


    上面的代码是用 zpf 对象的 extract 方法,把压缩包内的文件列表中的文件一个个释放到指定的目录。

    有的时候我们需要提取压缩文件内的个别文件,就可以在上面代码的基础上加一个选择语句判断一下是否需要的文件,代码示例如下。



    3、解压缩有密码的zip压缩文件


    解压缩有密码的 zip 压缩文件,我们只需要为 zp 对象的 extractall 方法和 extract 方法增加一个 pwd 参数就行。




    注意 pwd 参数的值需要转换成 UTF-8 编码的字节串。


    也有一些程序不是怎么处理密码的,它们不是为 zp 对象的 extractall 方法 extract 方法增加一个 pwd 参数,而是在打开 zip 文件之后先用 zp 对象的 setpassword 方法预填充一下密码,后面解压缩的时候就无需带 pwd 参数了。


    不少人以为 zp 对象的 setpassword 方法是用来在压缩时创建密码的,其实这种观点是不对的,它的真正作用是在解压缩时用来预填充密码。


    不过,这个 setpassword 方法如果预填充的密码不正确,它不会给出任何提示,到解压缩的环节还是会报错。


    如果想在预填充密码的环节就知道密码对不对,我们可以用下面的方法。




    4、关于解压缩乱码的问题


    有些zip压缩文件内包含中文文件名,解压缩之后是乱码。看下面的例子。


    有一个文件名叫“示例.txt”,用 WinRAR 压缩成 “示例.zip”,再用下面的代码解压缩就会得到一个乱码文件,文件名变成了“╩╛└²”。



    造成乱码的原因是 zipfile 标准库只认 utf-8 编码 和 cp437 编码,只要不确定是 utf-8 编码,它就一律认为是 cp437编码,相当一部分包含汉子的文件名在加压缩时被认成了 cp437 编码,所以发生了乱码现象。解决办法是逐个获取zip压缩文件的文件名,然后根据一些信息在确定该文件的编码不是 utf-8 之后直接用指定编码来解压缩该文件即可。在咱们中文Windows操作系统中,我们指定用 gb18030 编码就行。


    具体操作思路请看下面的例子。





    至此,本文三种方法解压缩zip文件的方法就介绍完毕。本文的所有代码在 Win 10 64位 + Python 3.6.5 64位环境中运行通过。


    六、联系交流

    欢迎跟图书《Python程序设计(基于计算思维和新文科建设)》的作者胡凤国老师进行交流,作者电邮:cuchufengguo@163.com ,也可以给公众号留言进行交流。

    欢迎关注微信公众号“语和言”,本公众号将不定期发布对本书Python知识点的解读和补充内容。


    语和言公众号还有读者交流群,经常跟作者交流的读者朋友可以入群一起讨论问题。


    文章转载自语和言,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论