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

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)

方案合理性评估

你最初的方案存在两个明显缺陷:

  1. 依赖本地磁盘:在无磁盘权限的云环境(如Azure Function)中无法运行,大文件还会占用磁盘空间
  2. 效率低下:下载→写入本地→读取本地→上传的流程多了两次磁盘IO,拖慢传输速度

推荐的内存流方案更合理:

  • 全程在内存中完成压缩与上传,无本地文件依赖,适配所有云部署场景
  • 减少磁盘IO环节,提升整体处理效率
  • 代码更简洁,无需额外处理本地文件的创建/删除

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:45:38