文章目录
- ZipFile对象
- 写入压缩文件
- 读取和解压缩
- 常用属性
- ZipInfo
ZipFile对象
顾名思义,zipfile是处理zip文件的模块,其中最重要的类是ZipFile,其构造函数为
ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, *, strict_timestamps=True)
各参数含义如下
file文件路径或者文件对象mode文件打开模式,可以为r, w, a, x,表示读、写、追加、新建写入。compression压缩方案,可以是ZIP_STORED,ZIP_DEFLATED,ZIP_BZIP2或ZIP_LZMAallowZip64为True时,若文件大于4GiB,zipfile将创建使用ZIP64扩展的ZIP文件;为False则引发异常。compresslevel为压缩等级,在ZIP_DEFLATED时可选整数0-9,在ZIP_BZIP2时可选整数1-9,其他压缩方案不可用。strict_timestamps设为False时允许压缩早于1980年以前活2108年之后的文件,但时间戳会设为1980-01-01或2107-12-31。
写入压缩文件
下面对读写zip数据做一个简单的示例
import zipfile, os
test = "if you miss the train i'm on" * 500
with zipfile.ZipFile('test.zip', 'w') as z:
z.writestr("test.txt", test)
效果如下

其中,z.writestr("test.txt", test)表示将test写入test.txt后,在存档到压缩文件z中。
读取和解压缩
能写就能读,下面来演示一下Zipfile.read的功能
z = zipfile.ZipFile('test.zip', 'r')
z.namelist() # 读取压缩文件中的文件列表
# ['test.txt']
z.read('test.txt') # 读取`test.txt`中的内容
# if you miss the train i'm onif you miss the train...
通过printdir可以查看压缩文件中更加详细的文件信息。
>>> z.printdir()
File Name Modified Size
test.txt 2023-01-19 12:32:12 14000
一般来说,通过代码来读写压缩文件是程序员的事儿,程序员要做的往往是给用户提供一个按钮,按下这个按钮可以实现压缩和解压缩。在ZipFile中,extract和extract可以便捷地将压缩包里面的文件解压到指定位置,下面代码将z中所有的文件解压到test文件夹中,如果test文件夹不存在,则创建。
z.extractall('test')
常用属性
ZipFile封装的属性和没有参数的常用方法如下
filenameZIP 文件的名称debug要使用的调试输出等级,可设0(默认无输出)到3(最多输出)comment关联到ZIP文件的字节对象形式的说明close()关闭归档文件,在退出程序之前必须调用,否则数据不会被写入。namelist()返回按名称排序的归档成员列表infolist()返回每个归档成员的 ZipInfo 对象printdir()打印归档的目录表testzip()读取归档中的所有文件并检查它们的 CRC 和文件头。 返回第一个已损坏文件的名称,在其他情况下则返回 None。
ZipInfo
通过ZipFile.getinfo(name)返回的是一个ZipInfo对象,如果name为空,则返回压缩包中所有文件的信息列表。ZipInfo对象支持如下属性:
| 属性 | 说明 | 属性 | 说明 |
|---|---|---|---|
| filename | 文件名称 | compress_type | 压缩类型 |
| date_time | 文件最后修改时间 | ||
| comment | 文档说明 | extr | 扩展项数据 |
| create_system | 创建该zip的系统 | ||
| create_version | 创建时的PKZIP版本 | extract_version | 解压所需PKZIP版本 |
| reserved | 预留字段,返回0 | ||
| flag_bits | zip标志位 | CRC | 未压缩文件的CRC-32 |
| volume | 文件头的卷标 | header_offset | 文件头偏移位。 |
| internal_attr | 内部属性 | external_attr | 外部属性 |
| compress_size | 压缩后大小 | file_size | 未压缩时大小 |
其中date_time的返回值是一个6元组,内容为:年月日时分秒,例如
>>> info = z.infolist()[0]
>>> info.date_time
(2023, 1, 19, 12, 32, 12)



















