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

Python内存创建目录并压缩为字节报错的技术求助

解决Zarr Store打包为Zip字节流的问题

错误原因分析

  • 第一个错误:shutil.make_archive的第一个参数要求是字符串/路径对象,你传入了SpooledTemporaryFile对象,类型不匹配。这个函数用于生成磁盘上的归档文件,无法直接写入内存文件对象。
  • 第二个错误:io.BytesIO仅接收字节数据,Zarr Store是存储接口(比如DirectoryStore对应磁盘目录),并非字节流,无法直接转换。

解决方案

假设data.to_directory()返回的是DirectoryStore(对应本地磁盘目录),提供两种实现方式:

方法1:内存中直接构建Zip(无临时磁盘文件)

适合中小型Zarr存储,全程在内存操作:

import zipfile
import io
from zarr.storage import DirectoryStore

def some_func(data):
    # 获取Zarr的DirectoryStore实例
    zarr_store = data.to_directory()
    assert isinstance(zarr_store, DirectoryStore), "需为DirectoryStore类型"
    
    # 创建内存Zip缓冲区
    zip_buffer = io.BytesIO()
    with zipfile.ZipFile(zip_buffer, "w", zipfile.ZIP_DEFLATED) as zip_file:
        # 遍历Zarr存储中的所有文件
        for key in zarr_store:
            # 跳过目录节点
            if key.endswith('/'):
                continue
            # 读取文件内容并写入Zip
            with zarr_store.open(key, 'rb') as f:
                zip_file.writestr(key, f.read())
    
    # 重置缓冲区指针并返回字节数据
    zip_buffer.seek(0)
    return zip_buffer.getvalue()

方法2:临时磁盘文件中转(适合大文件)

避免内存占用过高,通过临时文件生成Zip后读取字节:

import shutil
import tempfile
import os
from zarr.storage import DirectoryStore

def some_func(data):
    zarr_store = data.to_directory()
    assert isinstance(zarr_store, DirectoryStore), "需为DirectoryStore类型"
    zarr_dir = zarr_store.path  # 获取Zarr对应的本地目录路径
    
    # 创建临时目录存放Zip文件
    with tempfile.TemporaryDirectory() as temp_dir:
        zip_prefix = os.path.join(temp_dir, "final")
        # 生成Zip文件到临时目录
        shutil.make_archive(zip_prefix, 'zip', zarr_dir)
        zip_path = f"{zip_prefix}.zip"
        
        # 读取Zip文件的字节数据
        with open(zip_path, 'rb') as f:
            zip_bytes = f.read()
    
    return zip_bytes

关键说明

  • 若data.to_directory()返回的是MemoryStore等其他Zarr存储类型,可直接遍历其键值对,将内容写入内存Zip即可,无需依赖本地目录。
  • 方法1内存占用低、速度快;方法2适合超大Zarr存储,避免内存溢出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:20:38