文章目录
- 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_LZMA
allowZip64
为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
封装的属性和没有参数的常用方法如下
filename
ZIP 文件的名称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)