You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 23:25:02