
3.5 处理压缩文件
在3.1节、3.2节已经介绍了os模块,该模块主要提供基本的对文件和目录的处理,在实际应用中,还会经常对文件进行压缩和解压。当然,有专门的压缩软件和解压软件支持这项操作,但这里将介绍如何利用Python编写代码来完成对文件的压缩和解压。
使用 Python 可以解压以下 5 种格式的压缩文件:.gz、.tar、.tgz、.zip、.rar,但这里只介绍对.zip文件的压缩和解压处理,对其他压缩文件的操作请大家查阅相关文件。
Python中的zipfile模块可以对文件进行压缩和解压操作[9,10]。
假设在本地磁盘有文件“D:\PythonTest\zipfile_document\word_document.rar”和文件“D:\PythonTest\zipfile_document\word_document.zip”,请观察以下命令执行的情况:


这里,利用“os.path.join()”得到两个文件的完整路径:
D:\PythonTest\zipfile_document\word_document.rar;
D:\PythonTest\zipfile_document\word_document.zip.
下面将介绍zipfile模块的namelist()方法,该方法得到的是一个列表。
【例3-22】 zipfile模块的namelist()方法的使用。

说明:输出列表中的第一个元素是文件夹名,不是文件名。
注意:namelist()方法能够获取指定压缩文件里的所有文件名(包括子文件夹下的文件),返回的是一个列表,但是文件夹(包括子文件夹)的名字出现在列表的前面,之后才是文件名,所有文件按照目录层次列出。
【例3-23】 解压指定目录下的压缩文件并保存到指定的文件夹下。


程序运行后请打开资源管理器查看结果。
注意:代码中“os.mkdir(path)”的作用是创建一个新的文件夹,mkdir()在使用时必须确保要创建的新文件夹不存在,否则会报错!
【例 3-24】 压缩指定目录下文件夹内的文件,压缩文件中只添加一级子目录下的文件。

注意:本例中的代码只能将指定文件夹中的全部文件添加到压缩包里,不能将文件夹中子文件夹里的文件添加到压缩包中,即当解压压缩后的文件时,会发现子文件夹是空的。请运行本程序后打开资源管理器进行查看,理解这里所说的情形。
【例 3-25】 对整个文件夹进行压缩,把下级子文件夹里的文件也添加到压缩文件中,但仍然保持原有的目录结构。

同样,请运行本程序后打开资源管理器进行查看,理解程序的功能。
zipfile 模块还有很多有用的方法(见表3-6),更多操作请大家上机进行测试。

上述命令利用 zipfile 模块提供的 ZipFile()类构造了一个 zipfile 文件对象,同时打开指定的名为“filename”的.zip 文件。打开压缩文件的模式(mode)可以是'r'、'w'、'a',分别代表打开文件的不同的方式。'r'表示解压文件,'w'和'a'表示压缩文件。压缩标志“compression”指明了这个 zipfile 文件的压缩方法,默认是 ZIP_STORED,另一种选择是 ZIP_DEFLATED。allowZip64 是个 bool 型变量,当设置为 True 时可以用来创建大于2GB的.zip文件,默认值是True[9~11]。
表3-6 zipfile模块的常用方法

续表

【例3-26】 输出指定目录下的.zip文件里的文件信息。
