Python - 列出 Azure 存储容器内的所有文件和 blob

Car*_*ine 3 python blobstorage azure-storage azure-blob-storage

这是我在 StackOverflow 上的第一篇文章,希望它尊重这个社区的准则。

我正在尝试用 Python 完成一个简单的任务,因为尽管我对它很陌生,但我发现它非常容易使用。我在Azure上有一个存储帐户,里面有很多容器。每个容器包含一些随机文件和/或 blob。

我想做的是获取所有这些文件和/或 blob 的名称并将其放在文件中。

现在,我到达这里:

import os, uuid
import sys
from azure.storage.blob import BlobServiceClient, BlobClient, ContainerClient, __version__
connection_string = "my_connection_string"
blob_svc = BlobServiceClient.from_connection_string(conn_str=connection_string)


try:

    print("Azure Blob Storage v" + __version__ + " - Python quickstart sample")
    print("\nListing blobs...")
    containers = blob_svc.list_containers()
    list_of_blobs = []


    for c in containers:
      container_client = blob_svc.get_container_client(c)
      blob_list = container_client.list_blobs()
      for blob in blob_list:
        list_of_blobs.append(blob.name)
      file_path = 'C:/my/path/to/file/randomfile.txt'
      sys.stdout = open(file_path, "w")
      print(list_of_blobs)

except Exception as ex:
    print('Exception:')
    print(ex) 

Run Code Online (Sandbox Code Playgroud)

但我有 3 个问题:

  1. 我收到 <name_of_ the_blob>/<name_of_the_file_inside>:我只想得到 blob 内文件的名称

  2. 如果容器中有一个 blob(或超过 1 个 blob)+一个随机文件,则此脚本仅打印 blob 的名称 +内部文件的名称,跳过 blob 外部的其他文件。

  3. 我想将 blob/文件的所有名称放入 .csv 文件中。

但我不知道如何做第3点,以及如何解决第1点和第2点。

云一些可能对此有帮助吗?

谢谢!

编辑:

我在此处添加图像只是为了澄清我谈论 blob/文件时的意思

Azure 存储帐户内的容器示例

Swe*_*nda 6

只是为了澄清一下,Blob 存储中不存在文件或 Blob 之类的两种东西,Blob 存储中的文件称为 Blob。下面是您可以在 Blob 存储中观察到的层次结构。

Blob 存储 > 容器 > 目录/虚拟文件夹 > Blob

我收到 <name_of_ the_blob>/<name_of_the_file_inside>:我只想得到 blob 内文件的名称

为此,您可以list_blobs(<Container_Name>)仅使用 blob 的名称(即 blob.name)来迭代容器。当您尝试列出容器内的所有 blob 名称时,代码的运行方式如下。

generator = blob_service.list_blobs(CONTAINER_NAME)
for blob in generator:
    print("\t Blob name: "+c.name+'/'+  blob.name)
Run Code Online (Sandbox Code Playgroud)

如果容器中有一个 blob(或超过 1 个 blob)+一个随机文件,则此脚本仅打印 blob 的名称 + 内部文件的名称,跳过 blob 外部的其他文件。

您可以对容器使用 iterate list_containers(),然后使用list_blobs(<Container_Name>)来迭代 blob 名称,最后将 blob 名称写入本地文件。

我想将 blob/文件的所有名称放入 .csv 文件中。

一个简单的with open('<filename>.csv', 'w') as f write。下面是示例代码

with open('BlobsNames.csv', 'w') as f:
     f.write(<statements>)
Run Code Online (Sandbox Code Playgroud)

这是对我们有用的完整示例代码,其中将列出每个文件夹中的每个 blob。

import os
from azure.storage.blob import BlockBlobService

ACCOUNT_NAME = "<ACCOUNT_NAME>"
SAS_TOKEN='<YOUR_SAS_TOKEN>'

blob_service = BlockBlobService(account_name=ACCOUNT_NAME,account_key=None,sas_token=SAS_TOKEN)

print("\nList blobs in the container")
with open('BlobsNames.txt', 'w') as f:
    containers = blob_service.list_containers()
    for c in containers:
        generator = blob_service.list_blobs(c.name)
        for blob in generator:
            print("\t Blob name: "+c.name+'/'+  blob.name)
            f.write(c.name+'/'+blob.name)
            f.write('\n')    
Run Code Online (Sandbox Code Playgroud)

即使容器中有文件夹,这也可以工作。

结果:

在此输入图像描述

注意:c.name如果您的要求只是提取 blob 名称,则可以在将 blob 打印到文件时删除。