使用python读取嵌套blob返回http400

2024-09-24 02:28:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Python使用list blob读入blob并生成共享访问签名,但是当我尝试读入嵌套文件中的blob时收到一个HTTP 400错误(例如,它可以很好地处理folder/file,但不能处理folder/folder/file)

blobList = blob_service.list_blobs(<container name>)

for blob in blobList:  

    sas_token = blob_service.generate_blob_shared_access_signature(<container 
    name>,blob.name, permission=BlobPermissions.READ, expiry=datetime.utcnow() + 
    timedelta(hours=1))

    blob_url_with_sas = blob_service.make_blob_url(<container name>, blob.name, 
    sas_token=sas_token)

    # pass the blob url with sas to read in excel to data frame
    df = pd.read_excel(blob_url_with_sas)

Tags: tonameintokenurlreadcontainerservice
1条回答
网友
1楼 · 发布于 2024-09-24 02:28:32

我对你的代码做了如下修改,并使它在我的Azure存储帐户上运行,然后我发现它可以正常工作。你知道吗

from azure.storage.blob.baseblobservice import BaseBlobService
from azure.storage.blob import BlobPermissions
from datetime import datetime, timedelta

account_name = '<my storage account>'
account_key = '<my storage account key>'
container_name = 'test'

blob_service = BaseBlobService(
    account_name=account_name,
    account_key=account_key
)

blobs = blob_service.list_blobs(container_name)
import pandas as pd
for blob in blobs:
    if blob.name.endswith('xlsx'): # I added it to check for my blob whether be excel file
        print(container_name, blob.name)
        sas_token = blob_service.generate_blob_shared_access_signature(container_name,blob.name, permission=BlobPermissions.READ, expiry=datetime.utcnow() + timedelta(hours=1))
        blob_url_with_sas = blob_service.make_blob_url(container_name, blob.name, sas_token=sas_token)
        df = pd.read_excel(blob_url_with_sas)
        print(df)

结果如下。你知道吗

test myfolder/excel/testing.xlsx
   A  B  C
0  1  2  3
1  4  5  6
test excel/testing.xlsx
   A  B  C
0  1  2  3
1  4  5  6

所以我怀疑你的问题是由其他原因引起的,而不是由嵌套文件引起的。你知道吗

同时,我建议您可以考虑直接使用^{}函数而不是list_blobs来获得blob名称列表。你知道吗

blob_names = blob_service.list_blob_names(container_name)
import pandas as pd
for blob_name in blob_names:
    if blob_name.endswith('xlsx'): # I added it to check for my blob whether be excel file
        print(container_name, blob_name)
        sas_token = blob_service.generate_blob_shared_access_signature(container_name,blob_name, permission=BlobPermissions.READ, expiry=datetime.utcnow() + timedelta(hours=1))
        blob_url_with_sas = blob_service.make_blob_url(container_name, blob_name, sas_token=sas_token)
        df = pd.read_excel(blob_url_with_sas)
        print(df)

相关问题 更多 >