zipfile 是 Python 标准库中的一个模块,用于创建、读取、写入和管理 ZIP 压缩文件。它可以处理文件压缩和解压缩,支持多种模式。以下是 zipfile 模块的一些常用用法及示例:

1. 创建 ZIP 文件并写入内容

zipfile.ZipFile 支持通过 'w' 模式创建 ZIP 文件并写入文件。

import zipfile

# 创建一个新的 ZIP 文件
with zipfile.ZipFile('example.zip', 'w', zipfile.ZIP_DEFLATED) as zipf:
    zipf.write('file1.txt')  # 添加文件 file1.txt
    zipf.write('file2.txt')  # 添加文件 file2.txt
  • 'w' 表示创建新的 ZIP 文件,如果存在则覆盖。
  • zipfile.ZIP_DEFLATED 是一种压缩方法(常见的还有 zipfile.ZIP_STORED,即不压缩)。

2. 读取 ZIP 文件内容

可以通过 'r' 模式打开 ZIP 文件并查看其中的内容。

with zipfile.ZipFile('example.zip', 'r') as zipf:
    print(zipf.namelist())  # 获取 ZIP 文件中的所有文件名

输出示例:

['file1.txt', 'file2.txt']

3. 解压 ZIP 文件

将 ZIP 文件中的所有文件解压到指定目录。

with zipfile.ZipFile('example.zip', 'r') as zipf:
    zipf.extractall('output_directory')  # 解压到 output_directory 文件夹

你也可以解压单个文件:

with zipfile.ZipFile('example.zip', 'r') as zipf:
    zipf.extract('file1.txt', 'output_directory')  # 解压 file1.txt 到 output_directory

4. 向现有 ZIP 文件追加文件

使用 'a' 模式可以向已经存在的 ZIP 文件中追加文件,而不会删除已有文件。

with zipfile.ZipFile('example.zip', 'a', zipfile.ZIP_DEFLATED) as zipf:
    zipf.write('file3.txt')  # 追加 file3.txt

5. 获取 ZIP 文件中的文件信息

你可以使用 getinfo() 函数获取 ZIP 文件中某个文件的详细信息。

with zipfile.ZipFile('example.zip', 'r') as zipf:
    info = zipf.getinfo('file1.txt')
    print(info.file_size)  # 打印文件大小
    print(info.compress_size)  # 打印压缩后大小

6. 解压 ZIP 文件中的数据到内存中

你可以使用 open() 方法将文件解压到内存中,而不需要写入硬盘。

with zipfile.ZipFile('example.zip', 'r') as zipf:
    with zipf.open('file1.txt') as file:
        content = file.read()
        print(content)  # 读取 file1.txt 文件的内容

7. 使用 infolist() 获取所有文件的详细信息

infolist() 返回一个包含所有文件信息的列表。

with zipfile.ZipFile('example.zip', 'r') as zipf:
    for info in zipf.infolist():
        print(f"File Name: {info.filename}")
        print(f"File Size: {info.file_size}")
        print(f"Compress Size: {info.compress_size}")

8. 检查文件是否在 ZIP 文件中

使用 testzip() 可以检查 ZIP 文件中的文件是否损坏。

with zipfile.ZipFile('example.zip', 'r') as zipf:
    corrupt_file = zipf.testzip()
    if corrupt_file:
        print(f"Corrupted file found: {corrupt_file}")
    else:
        print("All files are good.")

9. 创建带有目录结构的 ZIP 文件

如果希望保留文件夹结构,你可以将文件夹递归压缩:

import os

def zipdir(path, zipf):
    for root, dirs, files in os.walk(path):
        for file in files:
            full_path = os.path.join(root, file)
            arcname = os.path.relpath(full_path, path)  # 保留相对路径
            zipf.write(full_path, arcname)

with zipfile.ZipFile('example_with_dirs.zip', 'w', zipfile.ZIP_DEFLATED) as zipf:
    zipdir('my_folder', zipf)

10. 删除 ZIP 文件中的某个文件

标准库 zipfile 模块不支持直接删除压缩包中的文件。你可以通过以下方式实现:

  1. 创建一个新的 ZIP 文件。
  2. 将需要保留的文件从旧 ZIP 文件复制到新 ZIP 文件。
  3. 不包括需要删除的文件。
import zipfile

def remove_file_from_zip(zip_path, file_to_remove):
    temp_zip_path = zip_path + '.tmp'

    with zipfile.ZipFile(zip_path, 'r') as zip_in:
        with zipfile.ZipFile(temp_zip_path, 'w', zipfile.ZIP_DEFLATED) as zip_out:
            for item in zip_in.infolist():
                if item.filename != file_to_remove:
                    zip_out.writestr(item, zip_in.read(item.filename))

    os.replace(temp_zip_path, zip_path)  # 用新的 zip 文件替换旧的

remove_file_from_zip('example.zip', 'file1.txt')

总结

zipfile 模块提供了丰富的功能,支持文件压缩、解压、读取文件信息等操作。以下是一些常见用法的总结:

  • 创建、追加 ZIP 文件:zipfile.ZipFile('filename.zip', 'w'/'a')
  • 解压 ZIP 文件:extractall()extract()
  • 查看文件列表:namelist()infolist()
  • 读取文件内容:open()read()
  • 检查文件是否损坏:testzip()

这些基本用法涵盖了大部分 ZIP 文件操作的需求。


zipfile.ZIP_DEFLATEDzipfile 模块中用于指定压缩方法的常量之一,表示使用 DEFLATE 算法来压缩文件。DEFLATE 是一种广泛使用的压缩算法,也是 ZIP 文件的默认压缩算法。

在创建 ZIP 文件时,ZIP_DEFLATED 选项会压缩文件以减少存储空间,而不是仅仅将文件存储到 ZIP 文件中。

常见压缩方法:

  1. **zipfile.ZIP_DEFLATED**:

    • 使用 DEFLATE 压缩算法,最常用的压缩方法,通常可以大大减少文件大小。
    • 要求 zlib 模块支持(Python 内置支持 zlib)。
  2. **zipfile.ZIP_STORED**:

    • 不进行压缩,只是将文件原样存储在 ZIP 文件中。
    • 如果你不需要压缩文件,可以使用此方法。
  3. **zipfile.ZIP_BZIP2**:

    • 使用 BZIP2 压缩算法,压缩率比 DEFLATE 更高,但速度较慢。
    • 需要 Python 3.3 及以上版本,并且依赖于 bz2 模块。
  4. **zipfile.ZIP_LZMA**:

    • 使用 LZMA 压缩算法,压缩率最高,但速度最慢。
    • 需要 Python 3.3 及以上版本,并且依赖于 lzma 模块。

使用示例:

import zipfile

# 使用 ZIP_DEFLATED 压缩算法创建 ZIP 文件
with zipfile.ZipFile('compressed.zip', 'w', zipfile.ZIP_DEFLATED) as zipf:
    zipf.write('file1.txt')  # 压缩并添加 file1.txt
    zipf.write('file2.txt')  # 压缩并添加 file2.txt

总结:

  • zipfile.ZIP_DEFLATED 使用了高效的 DEFLATE 算法,能在文件压缩和解压时提供较好的平衡。
  • 这是大多数情况下默认和推荐使用的压缩方式,因为它压缩效果好,解压速度也较快。