Python-zipfile-zip压缩文件相关操作

本文最后更新于:2021年1月12日 下午

信息

zipfilePython官方用于对zip压缩文件文件进行操作的库
这个模块提供了创建、读取、写入、添加及列出 ZIP 文件的工具

由于是官方的库,所以你并不需要担心安装的事情(它本身就在环境中了)

此模块目前不能处理分卷 ZIP 文件。它可以处理使用 ZIP64 扩展(超过 4 GB 的 ZIP 文件)的 ZIP 文件。它支持解密 ZIP 归档中的加密文件,但是目前不能创建一个加密的文件。解密非常慢,因为它是使用原生 Python 而不是 C 实现的

官方文档: https://docs.python.org/zh-cn/3/library/zipfile.html#zipfile-objects

使用

基础-创建/关闭 zipfile.ZipFile 对象

使用zipfile库基本就是围绕着 ZipFile 类/对象 做各种各样的操作

例:生成一个空的压缩文件

1
2
3
4
5
6
7
8
9
10
11
import zipfile


zip_f = zipfile.ZipFile(
file='folder/helloworld.zip',
mode='w',
allowZip64=False,
compression=zipfile.ZIP_DEFLATED,
compresslevel=5,
)
zip_f.close()
参数名 信息
file 传入str时为ZipFile对象关闭后,文件保存的路径
也可以传入ByteIO对象来承接保存的zip文件二进制内容
mode 操作模式, 和 open() 里的模式类似
r 来读取一个存在的文件
w 来截断并写入新的文件
a 来添加到一个存在的文件
x 来仅新建并写入新的文件, 如果 file 指向已经存在的文件,会报错
allowZip64 是否使用Zip64创建扩展的zip文件,默认为True
如果指定为False, 且最总zip文件大于 4GB,那么文件处理会报错
compression 压缩方法 可填入 ZIP_STORED, ZIP_DEFLATED, ZIP_BZIP2
如果不支持设定的模式可能会报错
compresslevel 压缩级别,默认根据压缩方法自动计算
可以填入一个 0~9之间的整数 来设置。传入的 数字越小,压缩速度越快,压缩率越低。 具体参考官方说明

创建一个 ZipFile 对象并不会立刻在对应路径中创建文件
执行其 close 方法时才真正创建文件

可以使用 with 来自动调用 close方法。使代码更加美观

写入压缩内容

实际上就是写入东西到 ZipFile 对象中
ZipFile 有两个方法可以将内容写到压缩文件中

  • write方法 传入文件路径,用于将已经存在的文件写入
  • writestr方法 直接写入新的内容

例:添加一些压缩内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import zipfile

folder_path = 'example/0_Basic_usage_of_the_library/python_zipfile'
with zipfile.ZipFile('{}/{}'.format(folder_path, 'helloworld.zip'), 'w') as f:
f.write(
# 已经存在的文件的路径
filename='{}/example.txt'.format(folder_path),
# 压缩文件中的文件路径
arcname='a_folder/z.txt',
)
f.writestr(
# 压缩文件中的文件路径
zinfo_or_arcname='a.txt',
# 文件数据,可写入 str类型 或 byte类型 数据
# 如果传入str类型,默认会用 utf-8 进行编码写入
data='Hello',
)

解压压缩文件

例: 将压缩文件内容解压出来

1
2
3
4
5
6
import zipfile

folder_path = 'example/0_Basic_usage_of_the_library/python_zipfile'
with zipfile.ZipFile('{}/helloworld.zip'.format(folder_path), 'r') as f:
for file in f.namelist():
f.extract(file, '{}/unzip/'.format(folder_path))

ZipFile.namelist()返回列表,列表中的元素为压缩文件中的每个文件


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!