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

Python从Minio对象创建Zip文件出现重复条目问题求助

问题根源与解决方案

你的代码里重复条目的问题很明确:每次调用zip_file.writestr(file_name, chunk)时,都会在Zip文件中创建一个全新的同名文件条目,而不是把分块内容追加到同一个文件里,最终就会出现一堆重复的文件。

修正分块写入的正确方式

你需要先为每个Minio文件创建一个Zip内部的文件句柄,然后把所有分块内容依次写入这个句柄,而不是每次分块都调用writestr。修改后的代码如下:

import time
import io
import zipfile

zip_buffer = io.BytesIO()
with zipfile.ZipFile(zip_buffer, "w") as zip_file:
    for url in minio_urls:
        file_name = url.split("/")[-1]

        # Retrieve the Minio object
        minio_object, object_name = get_object_from_minio(url)
        stream = minio_object.stream()

        # 创建Zip文件条目信息,可设置修改时间和压缩方式
        zip_info = zipfile.ZipInfo(file_name)
        zip_info.date_time = time.localtime(time.time())[:6]
        zip_info.compress_type = zipfile.ZIP_DEFLATED  # 可选,开启压缩节省空间

        # 打开Zip内部的文件句柄,逐块写入内容
        with zip_file.open(zip_info, mode='w') as zip_inner_file:
            CHUNK_SIZE = 64 * 1024  # 设置64KB的分块大小,可根据需求调整
            while True:
                chunk = next(stream, None)
                if chunk is None:
                    break
                zip_inner_file.write(chunk)

如果你的Minio返回的流支持read()方法(类文件对象),可以把循环改成更简洁的形式:

with zip_file.open(zip_info, mode='w') as zip_inner_file:
    CHUNK_SIZE = 64 * 1024
    while chunk := stream.read(CHUNK_SIZE):
        zip_inner_file.write(chunk)

更优的大文件Zip处理方案

  • 合理设置分块大小:一般选择64KB~1MB的分块大小,平衡内存占用和IO效率,避免过小的分块导致频繁IO操作。
  • 启用压缩(可选):如果对Zip文件大小有要求,设置compress_type=zipfile.ZIP_DEFLATED,但注意压缩会增加CPU消耗,大文件需要权衡速度和体积。
  • 避免内存溢出:全程使用流处理,不要把整个大文件读入内存,保持分块读写的模式,即使是GB级别的文件也能稳定处理。

内容的提问来源于stack exchange,提问作者lr_optim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:16:09