Search code examples
python-3.xazureazure-storageazure-blob-storage

Cannot list blobs in Azure container


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.


Solution

  • 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