- Python程序设计
- 张雪萍主编
- 988字
- 2020-08-27 23:59:44
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”,请观察以下命令执行的情况:
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/124_2.jpg?sign=1739597009-2QuhGFUIf8dYvPHGNUjzOcW15f57i476-0-407cfda911aac7c66f0e8430bceb6a83)
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/125_1.jpg?sign=1739597009-rMEwJoOzP94pyavXm03GuidDKX0YGTkr-0-628b9d6e935177408ad27b5b85a12853)
这里,利用“os.path.join()”得到两个文件的完整路径:
D:\PythonTest\zipfile_document\word_document.rar;
D:\PythonTest\zipfile_document\word_document.zip.
下面将介绍zipfile模块的namelist()方法,该方法得到的是一个列表。
【例3-22】 zipfile模块的namelist()方法的使用。
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/125_2.jpg?sign=1739597009-P7LqtjyuYJsJ90U1s7BYy8nE1w6k2i4W-0-66da1084d063f411c4fa49f5d232e792)
说明:输出列表中的第一个元素是文件夹名,不是文件名。
注意:namelist()方法能够获取指定压缩文件里的所有文件名(包括子文件夹下的文件),返回的是一个列表,但是文件夹(包括子文件夹)的名字出现在列表的前面,之后才是文件名,所有文件按照目录层次列出。
【例3-23】 解压指定目录下的压缩文件并保存到指定的文件夹下。
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/125_3.jpg?sign=1739597009-X7dQE2u5t8GY87dTYTHWb8vMMKDRtu2p-0-4ddf0c08fe9f35ee915b17e448219462)
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/126_1.jpg?sign=1739597009-v7WyvITFNILNyNVW2CPODq6YUfXsbOnL-0-f5085676b0c8a391f0725dfebaa67f0a)
程序运行后请打开资源管理器查看结果。
注意:代码中“os.mkdir(path)”的作用是创建一个新的文件夹,mkdir()在使用时必须确保要创建的新文件夹不存在,否则会报错!
【例 3-24】 压缩指定目录下文件夹内的文件,压缩文件中只添加一级子目录下的文件。
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/126_2.jpg?sign=1739597009-2iCt5fqa0j3gdxRxDcJpgtwvWrNgs7wy-0-16c80b23ba4b59fead80a2910811cb0e)
注意:本例中的代码只能将指定文件夹中的全部文件添加到压缩包里,不能将文件夹中子文件夹里的文件添加到压缩包中,即当解压压缩后的文件时,会发现子文件夹是空的。请运行本程序后打开资源管理器进行查看,理解这里所说的情形。
【例 3-25】 对整个文件夹进行压缩,把下级子文件夹里的文件也添加到压缩文件中,但仍然保持原有的目录结构。
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/127_1.jpg?sign=1739597009-jLHqBIWykST9ZbdnNVdX4QVMcMkhE3mJ-0-fff496aeea3ff1edd3214defd0eb104b)
同样,请运行本程序后打开资源管理器进行查看,理解程序的功能。
zipfile 模块还有很多有用的方法(见表3-6),更多操作请大家上机进行测试。
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/127_2.jpg?sign=1739597009-4hB7MoIUxXmHVjNauNd90INITQeXQ9ga-0-42b88873aa549557b879889fc64521af)
上述命令利用 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模块的常用方法
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/127_3.jpg?sign=1739597009-Wn2h3qQIFrt7HZ1Aun0hK6wYA40KT6Vl-0-f7e21ea3e80bea119c2c347497bf2503)
续表
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/128_1.jpg?sign=1739597009-FEKrLWQUfOg9XEdpnngHymZ8kOUccoUB-0-679209802afec57bf14f3fe2eb7275f2)
【例3-26】 输出指定目录下的.zip文件里的文件信息。
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/128_2.jpg?sign=1739597009-DPDRsQDaxzfFLHvr1g6U74jQnKl9nA2d-0-61e068b9af4f1e144d6560b6d7bdf468)