Python を使用して BLOB を一覧表示する
この記事では、Python 用の Azure Storage クライアント ライブラリを使用して BLOB を一覧表示する方法について説明します。
非同期 API を使用した BLOB の一覧表示の詳細については、BLOB を非同期で一覧表示する方法に関するページを参照してください。
前提条件
- Azure サブスクリプション - 無料アカウントを作成する
- Azure Storage アカウント - ストレージ アカウントの作成
- python=3.8.10
環境を設定する
既存のプロジェクトがない場合、Python 用 Azure Blob Storage クライアント ライブラリを操作するためのプロジェクトをセットアップする方法についてこのセクションで説明します。 詳細については、「Azure Blob Storage と Python で作業を開始する」を参照してください。
この記事のコード例を使用するには、次の手順に従ってプロジェクトを設定します。
パッケージをインストールする
pip install
を使用して次のパッケージをインストールしてください。
pip install azure-storage-blob azure-identity
import ステートメントを追加する
次の import
ステートメントを追加します。
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient, ContainerClient, BlobPrefix
承認
認可メカニズムには、BLOB を一覧表示するために必要なアクセス許可が必要です。 Microsoft Entra ID を使用した認可 (推奨) には、Azure RBAC 組み込みロールの Storage BLOB データ閲覧者以上が必要です。 詳細については、List Blobs (REST API) の「認可」のガイダンスを参照してください。
クライアント オブジェクトの作成
アプリを Blob Storage に接続するには、 BlobServiceClientのインスタンスを作成します。 次の例では、認可のために DefaultAzureCredential
を使用してクライアント オブジェクトを作成する方法を示します。
# TODO: Replace <storage-account-name> with your actual storage account name
account_url = "https://<storage-account-name>.blob.core.windows.net"
credential = DefaultAzureCredential()
# Create the BlobServiceClient object
blob_service_client = BlobServiceClient(account_url, credential=credential)
また、特定のコンテナーまたは BLOB 用のクライアント オブジェクトを、直接または BlobServiceClient
オブジェクトから作成することもできます。 クライアント オブジェクトの作成と管理の詳細については、「データ リソースを操作するクライアント オブジェクトを作成および管理する」を参照してください。
BLOB の一覧表示オプションについて
BLOB をコードから一覧表示する際に、Azure Storage から結果を返す方法を管理するための多くのオプションを指定できます。 各結果セットで返す結果の数を指定し、後続のセットを取得できます。 名前がその文字または文字列から始まる BLOB を返すようにプレフィックスを指定できます。 また、フラット リスト構造 (階層) で BLOB を一覧表示できます。 階層リストでは、フォルダーに整理されたかのように BLOB が返されます。
単純なリストを使用してコンテナー内の BLOB を一覧表示するには、次のいずれかのメソッドを呼び出します。
- ContainerClient.list_blobs (名前と共に、必要に応じて、各 BLOB に関連付けられているメタデータ、タグ、その他の情報を含めることができます)
- ContainerClient.list_blob_names (BLOB 名のみを返します)
階層リストを使用してコンテナー内の BLOB を一覧表示するには、次のメソッドを呼び出します。
- ContainerClient.walk_blobs (名前と共に、必要に応じて、各 BLOB に関連付けられているメタデータ、タグ、その他の情報を含めることができます)
プレフィックスを使用して結果をフィルター処理する
BLOB の一覧をフィルター処理するには、name_starts_with
キーワード引数の文字列を指定します。 プレフィックス文字列には、1 つ以上の文字を含めることができます。 Azure Storage は、名前がそのプレフィックスで始まる BLOB だけを返します。
フラットな一覧表示と階層的な一覧表示
Azure Storage の BLOB は、(従来のファイル システムのような) 階層的なパラダイムではなく、フラットなパラダイムで組織化されます。 ただし、フォルダー構造を模倣するために、BLOB を仮想ディレクトリに組織化することができます。 仮想ディレクトリは BLOB 名の一部を形成し、区切り文字によって示されます。
BLOB を仮想ディレクトリに組織化するには、BLOB 名に区切り文字を使用します。 既定の区切り文字はスラッシュ (/) ですが、区切り文字として任意の文字を指定できます。
区切り記号を使用して BLOB に名前を付ける場合、BLOB を階層的に一覧表示することを選択できます。 階層的な一覧表示操作の場合、Azure Storage は、親オブジェクトの下にあるすべての仮想ディレクトリと BLOB を返します。 従来のファイル システムをプログラムで走査するのと同じような方法で、一覧表示操作を再帰的に呼び出して階層を走査することができます。
フラットな一覧表示を使用する
既定では、一覧表示操作はフラットな一覧表示で BLOB を返します。 フラットな一覧表示では、BLOB は仮想ディレクトリ別に整理されません。
次の例では、フラットな一覧表示を使用して、指定されたコンテナー内の BLOB を一覧表示します。
def list_blobs_flat(self, blob_service_client: BlobServiceClient, container_name):
container_client = blob_service_client.get_container_client(container=container_name)
blob_list = container_client.list_blobs()
for blob in blob_list:
print(f"Name: {blob.name}")
サンプル出力は次のようになります。
List blobs flat:
Name: file4.txt
Name: folderA/file1.txt
Name: folderA/file2.txt
Name: folderA/folderB/file3.txt
リストの結果をフィルター処理したり、追加情報を表示したりするためのオプションを指定することもできます。 次の例では、BLOB と BLOB タグ一覧が表示されます:
def list_blobs_flat_options(self, blob_service_client: BlobServiceClient, container_name):
container_client = blob_service_client.get_container_client(container=container_name)
blob_list = container_client.list_blobs(include=['tags'])
for blob in blob_list:
print(f"Name: {blob['name']}, Tags: {blob['tags']}")
サンプル出力は次のようになります。
List blobs flat:
Name: file4.txt, Tags: None
Name: folderA/file1.txt, Tags: None
Name: folderA/file2.txt, Tags: None
Name: folderA/folderB/file3.txt, Tags: {'tag1': 'value1', 'tag2': 'value2'}
Note
次に示すサンプル出力では、フラット型名前空間を持つストレージ アカウントがあることを前提としています。 ストレージ アカウントで階層型名前空間の機能を有効にしている場合、ディレクトリは仮想ではありません。 そうではなく、具象の独立したオブジェクトです。 その結果、ディレクトリは長さ 0 の BLOB として一覧に表示されます。
階層型名前空間を使って作業する場合の別のリスト オプションについては、「ディレクトリの内容を一覧表示する (Azure Data Lake Storage)」を参照してください。
階層的な一覧表示を使用する
一覧表示操作を階層的に呼び出すと、Azure Storage は、階層の最初のレベルに仮想ディレクトリと BLOB を返します。
BLOB を階層的に一覧表示するには、次のメソッドを使用します。
次の例では、階層的な一覧表示を使用して、指定されたコンテナー内の BLOB を一覧表示します。
depth = 0
indent = " "
def list_blobs_hierarchical(self, container_client: ContainerClient, prefix):
for blob in container_client.walk_blobs(name_starts_with=prefix, delimiter='/'):
if isinstance(blob, BlobPrefix):
# Indentation is only added to show nesting in the output
print(f"{self.indent * self.depth}{blob.name}")
self.depth += 1
self.list_blobs_hierarchical(container_client, prefix=blob.name)
self.depth -= 1
else:
print(f"{self.indent * self.depth}{blob.name}")
サンプル出力は次のようになります。
folderA/
folderA/folderB/
folderA/folderB/file3.txt
folderA/file1.txt
folderA/file2.txt
file4.txt
Note
BLOB のスナップショットは、階層的な一覧表示操作では一覧表示できません。
BLOB を非同期で一覧表示する
Python 用 Azure Blob Storage クライアント ライブラリでは、BLOB の非同期一覧表示がサポートされています。 プロジェクトのセットアップ要件の詳細については、非同期プログラミングに関する記事を参照してください。
非同期 API を使用して BLOB を一覧表示するには、次の手順に従います。
次の import ステートメントを追加します。
import asyncio from azure.identity.aio import DefaultAzureCredential from azure.storage.blob.aio import BlobServiceClient, ContainerClient, BlobPrefix
asyncio.run
を使ってプログラムを実行するコードを追加します。 この関数では、この例で渡されたコルーチンmain()
を実行し、asyncio
イベント ループを管理します。 コルーチンは、async/await 構文で宣言されます。 この例のmain()
コルーチンでは、最初にasync with
を使用して最上位のBlobServiceClient
を作成し、次に BLOB を一覧表示するメソッドを呼び出します。 最上位のクライアントのみでasync with
を使用する必要があることに注意してください。ここから作成された他のクライアントでは同じ接続プールを共有するためです。async def main(): sample = BlobSamples() # TODO: Replace <storage-account-name> with your actual storage account name account_url = "https://<storage-account-name>.blob.core.windows.net" credential = DefaultAzureCredential() async with BlobServiceClient(account_url, credential=credential) as blob_service_client: await sample.list_blobs_flat(blob_service_client, "sample-container") if __name__ == '__main__': asyncio.run(main())
BLOB を一覧表示するコードを追加します。 次のコード例では、フラット リストを使用して BLOB を一覧表示します。 このコードは同期の例と同じですが、メソッドが
async
キーワードを使って宣言されていることと、list_blobs
メソッドを呼び出すときにasync for
が使われていることが異なります。async def list_blobs_flat(self, blob_service_client: BlobServiceClient, container_name): container_client = blob_service_client.get_container_client(container=container_name) async for blob in container_client.list_blobs(): print(f"Name: {blob.name}")
この基本的なセットアップが整っている場合、async/await 構文を使って、この記事の他の例をコルーチンとして実装できます。
リソース
Python 用 Azure Blob Storage クライアント ライブラリを使用して BLOB を一覧表示する方法について詳しくは、次のリソースを参照してください。
コード サンプル
REST API の操作
Azure SDK for Python には Azure REST API に基づき構築されたライブラリが含まれるため、使い慣れた Python パラダイムを通じて REST API 操作を実施できます。 BLOB を一覧表示するためのクライアント ライブラリ メソッドは、次の REST API 操作を使用します。
- List Blobs (REST API)
クライアント ライブラリのリソース
こちらもご覧ください
関連するコンテンツ
- この記事は、Python の Blob Storage 開発者ガイドの一部です。 詳細については、「Python アプリの構築」にある開発者ガイドの記事の完全な一覧を参照してください。