在Python开发中,处理文件夹的压缩和解压是常见需求,尤其是需要备份多层级目录内容时,保留原有目录结构是关键。zipfile作为Python标准库的一部分,提供了完整的zip文件读写能力,无需安装第三方依赖就能完成相关操作。

zipfile模块基础介绍
zipfile模块主要用于处理zip格式的压缩文件,支持创建、读取、写入和解压zip包。核心类包括ZipFile和ZipInfo,前者用于操作整个zip文件,后者用于存储单个文件或目录的元数据信息。
常用核心方法
ZipFile(file, mode):创建ZipFile对象,mode为w时表示写入模式,r时表示读取模式write(filename, arcname):将指定文件写入zip包,arcname可设置文件在zip包中的路径extractall(path):将zip包中的所有内容解压到指定路径namelist():返回zip包中所有文件/目录的名称列表
递归打包多目录文件夹
要实现保留目录结构的文件夹压缩,核心是遍历目标文件夹下的所有文件和子目录,将每个文件的相对路径作为arcname写入zip包。递归遍历可以使用os.walk方法实现,它会自动遍历所有层级的子目录。
完整打包实现代码
import os
import zipfile
def zip_folder(source_dir, output_zip):
"""
递归压缩文件夹,保留原有目录结构
:param source_dir: 待压缩的源文件夹路径
:param output_zip: 输出的zip文件路径
"""
# 获取源文件夹的绝对路径,避免路径拼接问题
source_dir = os.path.abspath(source_dir)
with zipfile.ZipFile(output_zip, 'w', zipfile.ZIP_DEFLATED) as zipf:
# 遍历源文件夹下所有目录和文件
for root, dirs, files in os.walk(source_dir):
# 处理当前目录下的所有文件
for file in files:
file_path = os.path.join(root, file)
# 计算文件在zip包中的相对路径,保留目录结构
arcname = os.path.relpath(file_path, start=os.path.dirname(source_dir))
zipf.write(file_path, arcname)
print(f"文件夹压缩完成,输出路径:{output_zip}")
# 使用示例
if __name__ == '__main__':
# 待压缩的文件夹路径
target_dir = './test_data'
# 输出的zip文件路径
zip_path = './backup.zip'
zip_folder(target_dir, zip_path)
上述代码中,os.walk会逐层遍历source_dir下的所有内容,os.path.relpath用于计算文件相对于源文件夹父目录的路径,确保压缩后的zip包内目录结构和原文件夹完全一致。zipfile.ZIP_DEFLATED表示使用deflate压缩算法,能有效减小压缩包体积。
解压zip包还原目录结构
解压操作相对简单,zipfile的extractall方法会自动还原zip包内的所有目录和文件结构,不需要额外处理递归逻辑。
完整解压实现代码
import zipfile
import os
def unzip_file(zip_path, extract_dir):
"""
解压zip包到指定目录,自动还原目录结构
:param zip_path: 待解压的zip文件路径
:param extract_dir: 解压目标目录路径
"""
# 确保目标目录存在,不存在则自动创建
os.makedirs(extract_dir, exist_ok=True)
with zipfile.ZipFile(zip_path, 'r') as zipf:
# 解压所有内容到目标目录
zipf.extractall(extract_dir)
print(f"解压完成,文件已还原到:{extract_dir}")
# 使用示例
if __name__ == '__main__':
# 待解压的zip文件路径
zip_file = './backup.zip'
# 解压目标目录
extract_target = './restored_data'
unzip_file(zip_file, extract_target)
使用extractall方法时,zip包内的所有目录层级会被自动创建,文件会被放到对应的目录位置,完全还原打包前的目录结构。如果需要单独解压某个文件,可以使用extract方法,传入文件名和目标路径即可。
操作注意事项
- 打包时如果源文件夹路径包含中文,需要确保Python环境编码正常,避免路径乱码导致文件写入失败
- 解压zip包前建议先检查目标目录是否存在,避免覆盖已有重要文件,可先创建临时目录再解压
- 如果要处理超大文件,建议分批次写入zip包,避免一次性占用过多内存
- 部分zip包可能带有密码,zipfile模块对加密zip的支持有限,复杂加密场景建议使用第三方库如pyzipper
zipfile模块是Python处理zip文件的首选方案,内置在标准库中,兼容性好,性能稳定,能满足大部分日常文件夹压缩和解压备份的需求。