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
相关产品推荐
相关产品推荐

