Python 实现文件夹 ZIP 压缩:从入门到进阶

Python 压缩文件夹的必备技能

在数据处理和备份任务中,使用 Python 压缩文件夹是一项常见需求。Python 标准库中的 zipfile 模块提供了完整的 ZIP 文件操作功能,无需安装额外依赖。

基础压缩方法

以下是一个最简单的文件夹压缩示例:

import zipfile
import os

def zip_folder(folder_path, zip_path):
    with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
        for root, dirs, files in os.walk(folder_path):
            for file in files:
                file_path = os.path.join(root, file)
                arcname = os.path.relpath(file_path, os.path.dirname(folder_path))
                zipf.write(file_path, arcname)

关键参数解析

  • ZIP_STORED:仅存储,不压缩
  • ZIP_DEFLATED:标准压缩算法,需要 zlib 库
  • ZIP_BZIP2:BZIP2 压缩,压缩率更高但速度较慢
  • ZIP_LZMA:LZMA 压缩,适合大文件

处理常见问题

在实际应用中,可能需要处理以下特殊情况:

1. 保留原始路径结构

使用 os.path.relpath() 确保压缩包内的目录结构与原始文件夹一致。

2. 排除特定文件

可以在遍历文件时添加条件判断,排除不需要压缩的文件类型。

3. 大文件压缩

对于大文件夹,建议分块读写并添加进度显示功能。

性能优化建议

为了提高压缩效率,可以考虑以下优化策略:

  1. 使用多线程并行压缩多个文件
  2. 根据文件类型选择合适的压缩算法
  3. 设置合适的压缩级别平衡速度和压缩率
  4. 对重复内容较多的文件使用更好的压缩策略

完整示例代码

以下是一个包含错误处理和进度显示的完整实现:

import zipfile
import os
from tqdm import tqdm  # 需要安装 tqdm 库

def zip_folder_advanced(folder_path, zip_path):
    if not os.path.exists(folder_path):
        raise FileNotFoundError(f"目录不存在: {folder_path}")
    
    # 获取文件列表用于进度显示
    file_list = []
    for root, dirs, files in os.walk(folder_path):
        for file in files:
            file_list.append(os.path.join(root, file))
    
    with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
        for file_path in tqdm(file_list, desc="压缩进度"):
            try:
                arcname = os.path.relpath(file_path, os.path.dirname(folder_path))
                zipf.write(file_path, arcname)
            except Exception as e:
                print(f"警告: 压缩文件 {file_path} 时出错: {e}")

    return zip_path

总结

掌握 Python 的文件夹压缩技术可以极大提升工作效率,特别是在自动化脚本和数据备份场景中。通过合理使用 zipfile 模块的各种参数和优化技巧,可以创建高效、可靠的压缩解决方案。