0

I would like to list the blobs (the files) in an Azure container. To do so, I reproduced exactly the code snippet given as an example in the official documentation (see here). Here is what my code looks like:

from azure.storage.blob import BlobServiceClient, ContainerClient
from azure.identity import ClientSecretCredential

token_credential =  ClientSecretCredential(tenant_id='WWW',
                                           client_id='XXX',
                                           client_secret='YYY')

service = BlobServiceClient("ZZZ", credential=token_credential)

container_client = service.get_container_client(container='AAA')

print(container_client.container_name)

blob_list = container_client.list_blobs()

for blob in blob_list:
    print(blob.name + '\n')

All the lines in this example run fine except the last one, which throws the following error:

---------------------------------------------------------------------------
StorageErrorException                     Traceback (most recent call last)
/anaconda/envs/azureml_py36_automl/lib/python3.6/site-packages/azure/storage/blob/_list_blobs_helper.py in _get_next_cb(self, continuation_token)
     75                 cls=return_context_and_deserialized,
---> 76                 use_location=self.location_mode)
     77         except StorageErrorException as error:

/anaconda/envs/azureml_py36_automl/lib/python3.6/site-packages/azure/storage/blob/_generated/operations/_container_operations.py in list_blob_flat_segment(self, prefix, marker, maxresults, include, timeout, request_id, cls, **kwargs)
   1215             map_error(status_code=response.status_code, response=response, error_map=error_map)
-> 1216             raise models.StorageErrorException(response, self._deserialize)
   1217 

StorageErrorException: (InvalidQueryParameterValue) Value for one of the query parameters specified in the request URI is invalid.
RequestId:39f9e5c3-201f-0114-551d-efab6d000000
Time:2021-01-20T11:13:03.6566856Z

During handling of the above exception, another exception occurred:

AttributeError                            Traceback (most recent call last)
<ipython-input-6-a064d97987b5> in <module>
----> 1 for blob in blob_list:
      2     print(blob.name + '\n')

/anaconda/envs/azureml_py36_automl/lib/python3.6/site-packages/azure/core/paging.py in __next__(self)
    127         if self._page_iterator is None:
    128             self._page_iterator = itertools.chain.from_iterable(self.by_page())
--> 129         return next(self._page_iterator)
    130 
    131     next = __next__  # Python 2 compatibility.

/anaconda/envs/azureml_py36_automl/lib/python3.6/site-packages/azure/core/paging.py in __next__(self)
     74             raise StopIteration("End of paging")
     75         try:
---> 76             self._response = self._get_next(self.continuation_token)
     77         except AzureError as error:
     78             if not error.continuation_token:

/anaconda/envs/azureml_py36_automl/lib/python3.6/site-packages/azure/storage/blob/_list_blobs_helper.py in _get_next_cb(self, continuation_token)
     76                 use_location=self.location_mode)
     77         except StorageErrorException as error:
---> 78             process_storage_error(error)
     79 
     80     def _extract_data_cb(self, get_next_return):

/anaconda/envs/azureml_py36_automl/lib/python3.6/site-packages/azure/storage/blob/_shared/response_handlers.py in process_storage_error(storage_error)
     92         error_body = ContentDecodePolicy.deserialize_from_http_generics(storage_error.response)
     93         if error_body:
---> 94             for info in error_body.iter():
     95                 if info.tag.lower() == 'code':
     96                     error_code = info.text

AttributeError: 'dict' object has no attribute 'iter'

What am I doing wrong?

For info, I'm using Python 3.6.9 with azure-storage-blob version==12.5.0 and azure-identity==1.4.1.

3
  • The code looks correct. Does the account_url of BlobServiceClient format as "https://{StorageAccountName}.blob.core.windows.net/"? Commented Jan 20, 2021 at 13:37
  • @PamelaPeng No, the address is of the form "https://{StorageAccountName}.dfs.core.windows.net". Shall I change "dfs" for "blob" ? Commented Jan 20, 2021 at 14:06
  • Yes, dfs is designed for Azure Data Lake Storage Gen2. But you list the blobs of Blob Storage in your code. Commented Jan 21, 2021 at 1:17

1 Answer 1

2

The package azure.storage.blob is used to to access Azure blob. Account URL that we use in script should be like https://{StorageAccountName}.blob.core.windows.net. The URL https://{StorageAccountName}.dfs.core.windows.net is the URL of Azure Data Lake Storage Gen2. If you want to list files stored in Azure Data Lake Storage Gen2, you need to use the package azure-storage-file-datalake. Besides regarding how to use the package, please refer to the sample

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.