如何将DataFrame以CSV格式上传到仅提供blob_sas_url的Azure存储容器
问题解决方法
错误原因
open()函数仅支持传入本地文件路径、字节或类路径对象,你传入的region是pandas DataFrame对象,不符合参数要求,直接触发类型错误- 原代码存在变量混用问题:你创建的是
blob_client对象,但后续调用了未定义的container_client,也会导致后续运行报错
推荐解决方案(内存直传,无需写本地文件)
无需将DataFrame保存到本地磁盘,直接在内存中转成CSV字节流上传即可,代码如下:
from azure.storage.blob import BlobClient import pandas as pd import io blob_sas_url = "https://.........." # 替换为你的实际blob sas url blob_client = BlobClient.from_blob_url(blob_sas_url) # 将DataFrame转换为CSV格式的字节流 csv_bytes = io.BytesIO() region.to_csv(csv_bytes, encoding='utf-8', index=False) # 移动流指针到起始位置,避免上传空内容 csv_bytes.seek(0) # 上传字节流到blob存储,overwrite=True表示覆盖已有同名文件,不需要可删除 blob_client.upload_blob(data=csv_bytes, overwrite=True)
可选方案(先存本地文件再上传)
如果你需要先保留本地CSV副本,可以用以下代码:
from azure.storage.blob import BlobClient import pandas as pd # 先将DataFrame保存为本地CSV文件 local_csv_path = "output_blob_name.csv" region.to_csv(local_csv_path, encoding='utf-8', index=False) blob_sas_url = "https://.........." blob_client = BlobClient.from_blob_url(blob_sas_url) # 读取本地文件上传 with open(local_csv_path, "rb") as data: blob_client.upload_blob(data=data, overwrite=True)
补充:如果你持有的是容器级SAS URL
如果你的sas_url是整个容器的权限,不是单个blob的,可使用容器客户端指定上传文件名:
from azure.storage.blob import ContainerClient import pandas as pd import io container_sas_url = "你的容器级SAS URL" container_client = ContainerClient.from_container_url(container_sas_url) output_blob_name = "region.csv" # 自定义上传后的文件名 # 转CSV字节流逻辑同上 csv_bytes = io.BytesIO() region.to_csv(csv_bytes, encoding='utf-8', index=False) csv_bytes.seek(0) container_client.upload_blob(name=output_blob_name, data=csv_bytes, overwrite=True)
内容的提问来源于stack exchange,提问作者spartanboy
相关产品推荐
相关产品推荐

