簡體   English   中英

Write pandas dataframe to Azure Blob - Python sdk

[英]Write pandas dataframe to Azure Blob - Python sdk

我正在嘗試將 dataframe 作為 csv 上傳到 Blob。

以下是我的代碼:

from azure.storage.blob import BlobClient
sas_url = "https://XXX.blob.core.windows.net/YYYY?sp=r&st=2021-04-26T16:21:37Z&se=2021-04-27T00:21:37Z&spr=" \
          "https&sv=2020-02-10&sr=c&sig=lJxx45wdBT%2F5ZJQwPxxxxxxxxx0%3D"
blob_client = BlobClient.from_blob_url(sas_url)
print (blob_client)
blob_client.upload_blob(data=df1.to_csv(index=False))

錯誤是面部是:

Traceback (most recent call last):
  File "C:\xxx\xxx\PycharmProjects\DIF\venv\lib\site-packages\IPython\core\interactiveshell.py", line 3437, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-2-40ff66c54682>", line 1, in <module>
    runfile('C:/xxx/xxx/PycharmProjects/DIF/venv/Scripts/SF_ADLS.py', wdir='C:/xxx/xxx/PycharmProjects/DIF/venv/Scripts')
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2020.1.4\plugins\python-ce\helpers\pydev\_pydev_bundle\pydev_umd.py", line 197, in runfile
    pydev_imports.execfile(filename, global_vars, local_vars)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2020.1.4\plugins\python-ce\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "C:/xxx/xxx/PycharmProjects/DIF/venv/Scripts/SF_ADLS.py", line 99, in <module>
    blob_client = BlobClient.from_blob_url(sas_url)
  File "C:\Users\User\PycharmProjects\DIF\venv\lib\site-packages\azure\storage\blob\_blob_client.py", line 246, in from_blob_url
    container_name, blob_name = unquote(path_blob[-2]), unquote(path_blob[-1])
IndexError: list index out of range

第二種方法:通過 python 代碼生成 SAS 令牌:

from datetime import datetime, timedelta
from azure.storage.blob import BlobServiceClient, generate_account_sas, ResourceTypes, AccountSasPermissions
import pandas as pd

df1 = pd.read_csv(r'C:\ccc\ccc\AppData\Roaming\JetBrains\PyCharmCE2020.1\scratches\sf_metadata.csv')
sas_token = generate_account_sas(
    account_name="acct",
    account_key="so1uwLUIrFluxxxxxx38MGpL5XKU/yFNIkiyyyyitQPrWQ==",
    resource_types=ResourceTypes(service=True),
    permission=AccountSasPermissions(read=True,write=True,delete=True,add=True,create=True,update=True),
    expiry=datetime.utcnow() + timedelta(hours=1)
)

blob_service_client = BlobServiceClient(account_url="https://acct.blob.core.windows.net", credential=sas_token)
print (sas_token)
blob_client = blob_service_client.get_blob_client('testfs1', 'one', snapshot=None)
blob_client.upload_blob(data=df1.to_csv(index=False))

我面臨的錯誤:

azure.core.exceptions.HttpResponseError: This request is not authorized to perform this operation using this resource type.
RequestId:03e71e74-601e-0022-2f25-3be77a000000
Time:2021-04-27T05:24:51.5741680Z
ErrorCode:AuthorizationResourceTypeMismatch
Error:None

你能告訴我我必須在我的代碼中做哪些改變嗎? 謝謝。

根據官方文檔的定義,你的sas_url是錯誤的,你缺少blob-name

https://<account-name>.blob.core.windows.net/<container-name>/<blob-name>?<sas-token>

你可以參考這個例子

你最好在這里生成SAS Token

在此處輸入圖像描述

如果這里生成SAS Token,可能會出現認證失敗錯誤:

在此處輸入圖像描述

======================更新===================

請更換

resource_types=ResourceTypes(service=True)

resource_types=ResourceTypes(object=True)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM