Python zipfile模块
介绍
Python中的zipfile
模块是用于处理ZIP文件的标准库。ZIP文件是一种用于存储和传输文件的压缩格式,通常用于打包多个文件以便于传输或存储。zipfile
模块提供了一组用于处理ZIP文件的类和方法,使我们能够创建、读取和修改ZIP文件。
在本文中,我们将详细介绍zipfile
模块的常见用法和方法,并通过示例代码来演示实际应用。
基本用法
1. 创建ZIP文件
我们可以使用zipfile
模块来创建一个新的ZIP文件,并向其中添加文件或目录。首先,我们需要创建一个ZipFile
对象,并指定要创建的ZIP文件的路径和模式。
ZipFile
类的常用构造函数如下:
file
:要创建的ZIP文件的路径。mode
:打开ZIP文件的模式,可选值为r
(只读,默认)、w
(写入,如果文件已存在则覆盖)、x
(写入,如果文件已存在则抛出异常)、a
(追加,如果文件已存在则在文件末尾添加)。compression
:指定压缩方法,可选值为ZIP_STORED
(不压缩)和ZIP_DEFLATED
(使用ZIP默认的Deflate算法压缩)。allowZip64
:控制是否支持大容量ZIP文件。如果为True,则支持大容量ZIP文件(即文件大小超过4GB);如果为False,则不支持大容量ZIP文件。
下面是一个创建和添加文件的示例代码:
在上面的代码中,我们首先指定了要创建的ZIP文件的路径archive.zip
。然后,我们使用with
语句创建了一个ZipFile
对象zipf
,并指定了打开模式为w
(写入)。
接下来,我们使用write
方法向ZIP文件中添加一个文件。write
方法的第一个参数是要添加的文件的路径file_path
,第二个参数arcname
指定在ZIP文件中的存档名称。如果不指定arcname
,则默认使用文件名。
2. 解压ZIP文件
使用zipfile
模块,我们可以轻松地将ZIP文件的内容解压到指定的目录。我们可以使用ZipFile
对象的extractall
方法来实现。
extractall
方法的用法如下:
path
:解压到的目标目录的路径。如果不指定,将解压到当前工作目录。members
:要解压的文件列表。如果不指定,将解压所有文件。pwd
:ZIP文件的密码。如果ZIP文件加密,需要提供密码才能解压。
下面是一个解压ZIP文件的示例代码:
在上面的代码中,我们首先指定了要解压的ZIP文件的路径archive.zip
。然后,我们使用with
语句创建了一个ZipFile
对象zipf
,并指定了打开模式为r
(只读)。
接下来,我们使用extractall
方法将ZIP文件内容解压到extracted
目录。
3. 读取ZIP文件内容
zipfile
模块还提供了一些方法来读取ZIP文件中的内容,如获取文件列表、读取文件的内容等。下面是一些常用的方法:
ZipFile.namelist()
:返回ZIP文件中所有的文件和目录的名称列表。ZipFile.getinfo(name)
:返回指定文件或目录的ZipInfo
对象,包含了一些元数据,如文件大小、创建日期等。ZipFile.read(name, pwd=None)
:读取指定文件的内容,并以字节串的形式返回。ZipFile.open(name, mode='r', pwd=None)
:以文件对象的形式打开指定文件,可用于读取文件的内容。
下面是一个读取ZIP文件内容的示例代码:
在上面的代码中,我们首先使用with
语句创建了一个ZipFile
对象zipf
,并指定了打开模式为r
(只读)。
接下来,我们使用namelist
方法获取ZIP文件中所有文件和目录的名称列表,并打印输出。
然后,我们使用read
方法读取名为new_text.txt
的文件的内容,并以字节串的形式返回。为了将字节串转换为字符串,我们使用了decode
方法。
修改ZIP文件
1. 添加文件到ZIP
使用zipfile
模块,我们可以很方便地将新文件添加到现有的ZIP文件中。我们可以使用ZipFile
对象的write
方法来实现。
write
方法的用法如下:
filename
:要添加到ZIP文件的文件的路径。arcname
:在ZIP文件中的存档名称。如果不指定,将默认使用文件的文件名。compress_type
:指定压缩方法,可选值为ZIP_STORED
(不压缩)和ZIP_DEFLATED
(使用ZIP默认的Deflate算法压缩)。compresslevel
:指定压缩级别,可选范围为0-9,其中0表示无压缩,9表示最高压缩。
下面是一个添加文件到ZIP的示例代码:
在上面的代码中,我们使用with
语句创建了一个ZipFile
对象zipf
,并指定了打开模式为a
(追加)。
然后,我们使用write
方法将data/image.jpg
文件添加到ZIP文件中,存档名称为images/new_image.jpg
。
2. 删除ZIP文件中的文件
使用zipfile
模块,我们也可以删除ZIP文件中的文件。ZipFile
类提供了extract
和extractall
方法,可以解压ZIP文件,但没有提供直接删除ZIP文件中文件的方法。为了删除ZIP文件中的文件,我们需要通过以下步骤实现:
- 创建一个临时文件用于保存需要保留的文件内容。
- 遍历ZIP文件中的文件列表,将需要保留的文件内容写入临时文件。
- 关闭ZIP文件。
- 删除原来的ZIP文件。
- 创建新的ZIP文件,并将临时文件中的内容添加到新的ZIP文件中。
- 删除临时文件。
下面是一个删除ZIP文件中文件的示例代码:
在上面的代码中,我们首先指定了要删除的ZIP文件中的文件的路径archive.zip
和要删除的文件的名称images/new_image.jpg
。
然后,我们创建了一个临时文件temp_archive.zip
来保存需要保留的文件内容。我们使用两个嵌套的with
语句,分别使用ZipFile
对象打开原来的ZIP文件和临时文件。
接下来,我们使用infolist
方法遍历ZIP文件中的文件列表。对于每个文件,我们读取它的内容,并使用writestr
方法将内容写入临时文件中,实现了保留需要保留的文件内容。
然后,我们关闭原来的ZIP文件。
之后,我们使用os.remove
方法删除原来的ZIP文件。
然后,我们使用os.rename
方法将临时文件重命名为原来的ZIP文件名,实现了删除文件后的更新。
最后,我们删除临时文件。
总结
本文详细介绍了Python的zipfile
模块,以及它的常见用法和方法。我们学习了如何创建ZIP文件、解压ZIP文件、读取ZIP文件内容,以及如何修改ZIP文件,包括添加文件和删除文件。
zipfile
模块为我们处理ZIP文件提供了便利的接口,使我们能够轻松地对ZIP文件进行操作。无论是打包文件还是解压文件,zipfile
模块都能满足我们的需求。