如何使用Python列出Azure Cloud Storage中特定子目录内的所有Blob?

时间:2018-07-03 00:15:02

标签: python azure azure-storage

我研究了来自Azure文档https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-python

的示例代码
from azure.storage.blob import BlockBlobService
account_name = "x"
account_key = "x"
top_level_container_name = "top_container"

blob_service = BlockBlobService(account_name, account_key)

print("\nList blobs in the container")
generator = blob_service.list_blobs(top_level_container_name)
for blob in generator:
    print("\t Blob name: " + blob.name)

现在,我想知道如何在集装箱行走中获得更多的细颗粒。我的容器top_level_container_name有几个子目录

  • top_level_container_name / dir1
  • top_level_container_name / dir2
  • 该模式下的

我希望能够列出其中一个目录内的所有blob。例如

  • dir1 / a.jpg
  • dir1 / b.jpg

如何获取仅dir1内容的生成器,而不必遍历所有其他目录? (我也会带一个列表或字典)

我尝试将/ dir1添加到top_level_container_name的名称中,因此它应该是top_level_container_name = "top_container/dir1",但没有用。我返回错误代码azure.common.AzureHttpError: The requested URI does not represent any resource on the server. ErrorCode: InvalidUri

文档似乎甚至没有关于BlockBlobService.list_blobs()https://docs.microsoft.com/en-us/python/api/azure.storage.blob.blockblobservice.blockblobservice?view=azure-python

的任何信息

更新: list_blobs()来自https://github.com/Azure/azure-storage-python/blob/ff51954d1b9d11cd7ecd19143c1c0652ef1239cb/azure-storage-blob/azure/storage/blob/baseblobservice.py#L1202

4 个答案:

答案 0 :(得分:7)

请尝试以下操作:

generator = blob_service.list_blobs(top_level_container_name, prefix="dir1/")

这应该列出dir1虚拟目录中的Blob和文件夹。

如果要列出dir1虚拟目录中的所有blob,请尝试以下操作:

generator = blob_service.list_blobs(top_level_container_name, prefix="dir1/", delimiter="")

有关更多信息,请参阅此link

答案 1 :(得分:3)

无法导入BlockBlobService。好像BlobServiceClient是新的替代方法。 关注了官方doc,发现了这一点:

from azure.storage.blob import BlobServiceClient, BlobClient, ContainerClient

创建Blob存储帐户客户端

connect_str = <connectionstring>
blob_service_client = BlobServiceClient.from_connection_string(connect_str)

创建容器客户端

container_name="dummy"
container_client=blob_service_client.get_container_client(container_name)

这将列出dir1文件夹/目录内容器中的所有blob

blob_list = container_client.list_blobs(name_starts_with="dir1/")
for blob in blob_list:
print("\t" + blob.name)

答案 2 :(得分:1)

模块 azurebatchload 提供了这个和更多。您可以过滤文件夹或文件名,并选择以各种格式获取结果:

  • 列表
  • 带有扩展信息的字典
  • 熊猫数据框

1.仅将文件名作为列表列出整个容器。

from azurebatchload import Utils

list_blobs = Utils(container='containername').list_blobs()

2.仅将文件名作为数据框列出整个容器。

from azurebatchload import Utils

df_blobs = Utils(
   container='containername',
   dataframe=True
).list_blobs()

3.列出容器中的文件夹。

from azurebatchload import Utils

list_blobs = Utils(
   container='containername',
   name_starts_with="foldername/"
).list_blobs()

4.获取文件夹的扩展信息。

from azurebatchload import Utils

dict_blobs = Utils(
   container='containername',
   name_starts_with="foldername/",
   extended_info=True
).list_blobs()

5.获取作为 Pandas 数据帧返回的文件夹的扩展信息。

from azurebatchload import Utils

df_blobs = Utils(
   container='containername',
   name_starts_with="foldername/",
   extended_info=True,
   dataframe=True
).list_blobs()

免责声明:我是 azurebatchload 模块的作者。

答案 3 :(得分:0)

获取 dir 或子目录中的 blob 文件作为文件路径

from azure.storage.blob import BlockBlobService
blob_service = BlockBlobService(account_name, account_key)
blobfile = []
generator = blob_service.list_blobs(container_name, prefix="filepath/", delimiter="")
for blob in generator:
    blobname = blob.name.split('/')[-1]
    blobfile.append(blobname)
    print("\t Blob name: " + blob.name)
print(blobfile)

替换 delimiter="/" 以获取 blob 作为上述代码中的文件夹