簡體   English   中英

如何使用 Python 列出 Azure 雲存儲中特定子目錄內的所有 blob?

[英]How to list all blobs inside of a specific subdirectory in Azure Cloud Storage using Python?

我研究了 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。 例如

  • 目錄1/a.jpg
  • 目錄1/b.jpg
  • ETC

如何獲得僅包含 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 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

請嘗試以下操作:

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

無法導入 BlockBlobService。 似乎 BlobServiceClient 是新的選擇。 按照官方文檔,發現這個:

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)

azurebatchload模塊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 模塊的作者。

獲取 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 作為上述代碼中的文件夾

暫無
暫無

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

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