Python zipfile模块

Python zipfile模块

Python zipfile模块

介绍

Python中的zipfile模块是用于处理ZIP文件的标准库。ZIP文件是一种用于存储和传输文件的压缩格式,通常用于打包多个文件以便于传输或存储。zipfile模块提供了一组用于处理ZIP文件的类和方法,使我们能够创建、读取和修改ZIP文件。

在本文中,我们将详细介绍zipfile模块的常见用法和方法,并通过示例代码来演示实际应用。

基本用法

1. 创建ZIP文件

我们可以使用zipfile模块来创建一个新的ZIP文件,并向其中添加文件或目录。首先,我们需要创建一个ZipFile对象,并指定要创建的ZIP文件的路径和模式。

ZipFile类的常用构造函数如下:

ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True)
Python
  • file:要创建的ZIP文件的路径。
  • mode:打开ZIP文件的模式,可选值为r(只读,默认)、w(写入,如果文件已存在则覆盖)、x(写入,如果文件已存在则抛出异常)、a(追加,如果文件已存在则在文件末尾添加)。
  • compression:指定压缩方法,可选值为ZIP_STORED(不压缩)和ZIP_DEFLATED(使用ZIP默认的Deflate算法压缩)。
  • allowZip64:控制是否支持大容量ZIP文件。如果为True,则支持大容量ZIP文件(即文件大小超过4GB);如果为False,则不支持大容量ZIP文件。

下面是一个创建和添加文件的示例代码:

import zipfile

zipfile_path = 'archive.zip'
file_path = 'data/text.txt'

with zipfile.ZipFile(zipfile_path, 'w') as zipf:
    zipf.write(file_path, arcname='new_text.txt')
Python

在上面的代码中,我们首先指定了要创建的ZIP文件的路径archive.zip。然后,我们使用with语句创建了一个ZipFile对象zipf,并指定了打开模式为w(写入)。

接下来,我们使用write方法向ZIP文件中添加一个文件。write方法的第一个参数是要添加的文件的路径file_path,第二个参数arcname指定在ZIP文件中的存档名称。如果不指定arcname,则默认使用文件名。

2. 解压ZIP文件

使用zipfile模块,我们可以轻松地将ZIP文件的内容解压到指定的目录。我们可以使用ZipFile对象的extractall方法来实现。

extractall方法的用法如下:

ZipFile.extractall(path=None, members=None, pwd=None)
Python
  • path:解压到的目标目录的路径。如果不指定,将解压到当前工作目录。
  • members:要解压的文件列表。如果不指定,将解压所有文件。
  • pwd:ZIP文件的密码。如果ZIP文件加密,需要提供密码才能解压。

下面是一个解压ZIP文件的示例代码:

import zipfile

zipfile_path = 'archive.zip'
extract_path = 'extracted'

with zipfile.ZipFile(zipfile_path, 'r') as zipf:
    zipf.extractall(extract_path)
Python

在上面的代码中,我们首先指定了要解压的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文件内容的示例代码:

import zipfile

zipfile_path = 'archive.zip'

with zipfile.ZipFile(zipfile_path, 'r') as zipf:
    # 获取文件列表
    file_list = zipf.namelist()
    print(file_list)

    # 读取文件的内容
    text_content = zipf.read('new_text.txt')
    print(text_content.decode('utf-8'))
Python

在上面的代码中,我们首先使用with语句创建了一个ZipFile对象zipf,并指定了打开模式为r(只读)。

接下来,我们使用namelist方法获取ZIP文件中所有文件和目录的名称列表,并打印输出。

然后,我们使用read方法读取名为new_text.txt的文件的内容,并以字节串的形式返回。为了将字节串转换为字符串,我们使用了decode方法。

修改ZIP文件

1. 添加文件到ZIP

使用zipfile模块,我们可以很方便地将新文件添加到现有的ZIP文件中。我们可以使用ZipFile对象的write方法来实现。

write方法的用法如下:

ZipFile.write(filename, arcname=None, compress_type=None, compresslevel=None)
Python
  • filename:要添加到ZIP文件的文件的路径。
  • arcname:在ZIP文件中的存档名称。如果不指定,将默认使用文件的文件名。
  • compress_type:指定压缩方法,可选值为ZIP_STORED(不压缩)和ZIP_DEFLATED(使用ZIP默认的Deflate算法压缩)。
  • compresslevel:指定压缩级别,可选范围为0-9,其中0表示无压缩,9表示最高压缩。

下面是一个添加文件到ZIP的示例代码:

import zipfile

zipfile_path = 'archive.zip'
file_path = 'data/image.jpg'

with zipfile.ZipFile(zipfile_path, 'a') as zipf:
    zipf.write(file_path, arcname='images/new_image.jpg')
Python

在上面的代码中,我们使用with语句创建了一个ZipFile对象zipf,并指定了打开模式为a(追加)。

然后,我们使用write方法将data/image.jpg文件添加到ZIP文件中,存档名称为images/new_image.jpg

2. 删除ZIP文件中的文件

使用zipfile模块,我们也可以删除ZIP文件中的文件。ZipFile类提供了extractextractall方法,可以解压ZIP文件,但没有提供直接删除ZIP文件中文件的方法。为了删除ZIP文件中的文件,我们需要通过以下步骤实现:

  1. 创建一个临时文件用于保存需要保留的文件内容。
  2. 遍历ZIP文件中的文件列表,将需要保留的文件内容写入临时文件。
  3. 关闭ZIP文件。
  4. 删除原来的ZIP文件。
  5. 创建新的ZIP文件,并将临时文件中的内容添加到新的ZIP文件中。
  6. 删除临时文件。

下面是一个删除ZIP文件中文件的示例代码:

import zipfile
import os

zipfile_path = 'archive.zip'
file_to_delete = 'images/new_image.jpg'
temp_file = 'temp_archive.zip'

# 创建临时文件,保存需要保留的文件内容
with zipfile.ZipFile(zipfile_path, 'r') as zipf:
    with zipfile.ZipFile(temp_file, 'w') as temp_zipf:
        for item in zipf.infolist():
            if item.filename != file_to_delete:
                data = zipf.read(item.filename)
                temp_zipf.writestr(item, data)

# 删除原来的ZIP文件
os.remove(zipfile_path)

# 重命名临时文件为原来的ZIP文件名
os.rename(temp_file, zipfile_path)
Python

在上面的代码中,我们首先指定了要删除的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模块都能满足我们的需求。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册