使用Python的shutil模块创建Zip文件时出现嵌套Zip问题
解决shutil.make_archive生成嵌套Zip文件的问题
问题原因
你当前的代码把包含目标Zip文件的整个目录作为打包源,而在打包过程中,plots.zip已经开始生成并出现在该目录下,导致它被一起打包进最终的Zip文件里,形成嵌套。
解决方案
方案1:将Zip文件输出到目标目录外
直接修改输出路径,让生成的Zip不在要打包的目录范围内:
# 假设outPath是要打包的目录路径(比如"./folder/") # 将plots.zip生成在outPath的父目录,而非outPath内部 shutil.make_archive("plots", 'zip', outPath[:-1])
这样打包的是outPath下的内容,但Zip文件本身不在该目录里,就不会被嵌套进去。
方案2:临时打包后移动到目标目录
如果必须把Zip放在outPath内部,先打包到临时位置,再移动过去:
import shutil import os import tempfile # 生成临时Zip文件(避免被打包进目标目录) temp_zip_prefix = tempfile.mktemp() shutil.make_archive(temp_zip_prefix, 'zip', outPath[:-1]) temp_zip_path = f"{temp_zip_prefix}.zip" # 移动到目标路径 target_zip_path = os.path.join(outPath, "plots.zip") shutil.move(temp_zip_path, target_zip_path)
方案3:手动指定打包内容(排除Zip文件)
使用zipfile模块手动打包,明确排除要生成的Zip文件:
import zipfile import os target_zip_path = os.path.join(outPath, "plots.zip") source_dir = outPath[:-1] with zipfile.ZipFile(target_zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf: for root, dirs, files in os.walk(source_dir): for file in files: # 跳过正在生成的目标Zip文件 if file == "plots.zip": continue file_path = os.path.join(root, file) # 计算相对路径,避免打包整个绝对路径 arcname = os.path.relpath(file_path, source_dir) zipf.write(file_path, arcname)
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

