Azure Blob存储Python SDK压缩迁移文件报错及方案合理性咨询
错误原因与修复
你遇到的 ValueError: stat: embedded null character in path 是因为 ZipFile.write() 方法需要传入本地文件路径,但你直接传了从Blob下载的二进制数据,导致路径解析失败。
修正思路
- 用
ZipFile.writestr()替代write():该方法支持直接将二进制数据写入压缩包内的指定文件 - 优先使用内存流(
BytesIO)处理:避免生成本地临时文件,更适配云环境(如Serverless函数),同时减少磁盘IO提升效率
推荐修正代码(内存流方案)
from azure.storage.blob import BlobServiceClient from zipfile import ZipFile from io import BytesIO connection_string = "myConnectionString" blob_service_client = BlobServiceClient.from_connection_string(connection_string) # 获取容器客户端 input_container = blob_service_client.get_container_client(container="input") target_filename = "document_to_zip.pdf" zip_output_name = "document_zipped.zip" # 内存中完成压缩与上传 with BytesIO() as zip_buffer: with ZipFile(zip_buffer, "w") as zip_obj: # 下载Blob数据并写入压缩包 blob_data = input_container.download_blob(target_filename).readall() zip_obj.writestr(target_filename, blob_data) # 将内存流指针移至起始位置,准备上传 zip_buffer.seek(0) # 上传压缩包到output容器 output_blob_client = blob_service_client.get_blob_client(container="output", blob=zip_output_name) output_blob_client.upload_blob(zip_buffer, overwrite=True)
若需保留本地文件的修正方案(不推荐)
如果必须落地本地文件,需先将Blob数据写入本地文件,再加入压缩包:
from azure.storage.blob import BlobServiceClient from zipfile import ZipFile connection_string = "myConnectionString" blob_service_client = BlobServiceClient.from_connection_string(connection_string) input_container = blob_service_client.get_container_client(container="input") target_filename = "document_to_zip.pdf" zip_output_name = "document_zipped.zip" # 下载Blob到本地文件 with open(target_filename, "wb") as local_file: local_file.write(input_container.download_blob(target_filename).readall()) # 生成压缩包 with ZipFile(zip_output_name, "w") as zip_obj: zip_obj.write(target_filename) # 上传压缩包到output容器 with open(zip_output_name, "rb") as zip_file: output_blob_client = blob_service_client.get_blob_client(container="output", blob=zip_output_name) output_blob_client.upload_blob(zip_file, overwrite=True)
方案合理性评估
你最初的方案存在两个明显缺陷:
- 依赖本地磁盘:在无磁盘权限的云环境(如Azure Function)中无法运行,大文件还会占用磁盘空间
- 效率低下:下载→写入本地→读取本地→上传的流程多了两次磁盘IO,拖慢传输速度
推荐的内存流方案更合理:
- 全程在内存中完成压缩与上传,无本地文件依赖,适配所有云部署场景
- 减少磁盘IO环节,提升整体处理效率
- 代码更简洁,无需额外处理本地文件的创建/删除
内容的提问来源于stack exchange,提问作者user19941595
相关产品推荐
相关产品推荐

