zipfile 模块是 Python 标准库中用于处理 ZIP 压缩文件的模块,它提供了创建、读取、写入和修改 ZIP 文件的功能。

主要功能

  1. 读取 ZIP 文件内容
  2. 创建新的 ZIP 文件
  3. 向现有 ZIP 文件添加文件
  4. 提取 ZIP 文件内容
  5. 获取 ZIP 文件信息

基本用法

1. 读取 ZIP 文件

import zipfile

# 打开 ZIP 文件(只读模式)
with zipfile.ZipFile('example.zip', 'r') as zip_ref:
    # 获取 ZIP 文件中所有文件和目录的列表
    file_list = zip_ref.namelist()
    print("ZIP 文件内容:", file_list)
    
    # 获取文件信息
    for file_info in zip_ref.infolist():
        print(f"文件名: {file_info.filename}")
        print(f"文件大小: {file_info.file_size} 字节")
        print(f"压缩大小: {file_info.compress_size} 字节")
        print(f"压缩方法: {file_info.compress_type}")
        print("---")

2. 提取 ZIP 文件

import zipfile

# 提取所有文件到指定目录
with zipfile.ZipFile('example.zip', 'r') as zip_ref:
    zip_ref.extractall('extracted_files/')

# 提取单个文件
with zipfile.ZipFile('example.zip', 'r') as zip_ref:
    zip_ref.extract('specific_file.txt', 'extracted_files/')

3. 创建 ZIP 文件

import zipfile

# 创建新的 ZIP 文件并添加文件
with zipfile.ZipFile('new_archive.zip', 'w') as zip_ref:
    # 添加文件到 ZIP
    zip_ref.write('file1.txt')
    zip_ref.write('file2.txt')
    zip_ref.write('folder/file3.txt')  # 可以指定路径

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

import zipfile

# 使用追加模式向现有 ZIP 文件添加文件
with zipfile.ZipFile('existing_archive.zip', 'a') as zip_ref:
    zip_ref.write('new_file.txt')

高级功能

1. 使用不同的压缩方法

import zipfile

# 使用不同的压缩方法
with zipfile.ZipFile('compressed.zip', 'w', zipfile.ZIP_DEFLATED) as zip_ref:
    zip_ref.write('file.txt')  # 使用 DEFLATE 压缩

with zipfile.ZipFile('stored.zip', 'w', zipfile.ZIP_STORED) as zip_ref:
    zip_ref.write('file.txt')  # 不压缩,仅存储

2. 使用密码保护 ZIP 文件

import zipfile

# 创建加密的 ZIP 文件
with zipfile.ZipFile('encrypted.zip', 'w', zipfile.ZIP_DEFLATED) as zip_ref:
    zip_ref.setpassword(b'my_password')  # 设置密码
    zip_ref.write('secret_file.txt')

# 读取加密的 ZIP 文件
with zipfile.ZipFile('encrypted.zip', 'r') as zip_ref:
    zip_ref.setpassword(b'my_password')  # 提供密码
    zip_ref.extractall('extracted_encrypted/')

3. 处理大型文件

import zipfile

# 对于大型文件,可以逐块处理
def add_large_file_to_zip(zip_filename, file_to_add, chunk_size=8192):
    with zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) as zip_ref:
        with open(file_to_add, 'rb') as large_file:
            # 创建 ZIP 文件中的文件条目
            with zip_ref.open('large_file.bin', 'w') as zip_file:
                while True:
                    chunk = large_file.read(chunk_size)
                    if not chunk:
                        break
                    zip_file.write(chunk)

4. 检查 ZIP 文件完整性

import zipfile

# 测试 ZIP 文件是否完整
try:
    with zipfile.ZipFile('example.zip', 'r') as zip_ref:
        # 测试 ZIP 文件的完整性
        bad_file = zip_ref.testzip()
        if bad_file:
            print(f"损坏的文件: {bad_file}")
        else:
            print("ZIP 文件完整")
except zipfile.BadZipFile:
    print("这不是一个有效的 ZIP 文件")

常用类和方法

ZipFile 类主要方法

  • namelist(): 返回 ZIP 文件中所有文件和目录的列表
  • infolist(): 返回包含每个文件详细信息的 ZipInfo 对象列表
  • getinfo(name): 返回指定文件的 ZipInfo 对象
  • read(name): 读取指定文件的内容
  • extract(member, path=None): 提取单个文件
  • extractall(path=None, members=None): 提取所有文件或指定文件
  • write(filename, arcname=None): 向 ZIP 文件添加文件
  • close(): 关闭 ZIP 文件

ZipInfo 类属性

  • filename: 文件名
  • date_time: 文件最后修改时间(元组形式)
  • compress_type: 压缩方法
  • file_size: 原始文件大小
  • compress_size: 压缩后文件大小

实际应用示例

批量压缩文件夹

import zipfile
import os

def zip_directory(directory_path, zip_path):
    with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zip_ref:
        for root, dirs, files in os.walk(directory_path):
            for file in files:
                file_path = os.path.join(root, file)
                # 在 ZIP 文件中创建相对路径
                arcname = os.path.relpath(file_path, directory_path)
                zip_ref.write(file_path, arcname)

# 使用示例
zip_directory('my_folder', 'my_folder.zip')

从 ZIP 文件中搜索特定文件

import zipfile

def search_in_zip(zip_path, search_term):
    with zipfile.ZipFile(zip_path, 'r') as zip_ref:
        matching_files = []
        for file_name in zip_ref.namelist():
            if search_term.lower() in file_name.lower():
                matching_files.append(file_name)
        return matching_files

# 使用示例
results = search_in_zip('archive.zip', '.txt')
print("找到的文本文件:", results)

注意事项

  1. 文件路径: 在 Windows 系统上,路径分隔符会被自动转换为正斜杠(/)
  2. 编码: 对于非 ASCII 文件名,可能需要指定编码
  3. 大文件: 处理大文件时注意内存使用
  4. 安全性: 提取 ZIP 文件时注意路径遍历攻击

zipfile 模块是处理 ZIP 文件的强大工具,适用于各种压缩和解压缩需求。