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

