Вывод списка больших двоичных объектов с помощью Python

В этой статье показано, как перечислить большие двоичные объекты с помощью клиентской библиотеки служба хранилища Azure для Python.

Сведения о перечислении больших двоичных объектов с помощью асинхронных API см. в статье "Список больших двоичных объектов" асинхронно.

Необходимые компоненты

  • В этой статье предполагается, что у вас уже есть проект, настроенный для работы с клиентской библиотекой Хранилище BLOB-объектов Azure для Python. Сведения о настройке проекта, включая установку пакета, добавление import инструкций и создание авторизованного клиентского объекта, см. в статье "Начало работы с Хранилище BLOB-объектов Azure и Python".
  • Сведения об использовании асинхронных API в коде см. в разделе " Асинхронное программирование ".
  • Механизм авторизации должен иметь разрешения для перечисления больших двоичных объектов. Дополнительные сведения см. в руководстве по авторизации для следующей операции REST API:

Сведения о параметрах перечисления BLOB-объектов

При перечислении больших двоичных объектов из кода можно указать множество параметров для управления возвратом результатов из служба хранилища Azure. Можно указать число возвращаемых результатов в каждом наборе результатов, а затем извлечь последующие наборы. Можно указать префикс для возврата больших двоичных объектов, имена которых начинаются с указанного символа или строки. Кроме того, можно создать неструктурированный или структурированный список больших двоичных объектов. В структурированном списке большие двоичные объекты представлены так, будто они организованы по папкам.

Чтобы перечислить большие двоичные объекты в контейнере с помощью неструктурированного списка, вызовите один из следующих методов:

  • ContainerClient.list_blobs (а также имя, можно также включить метаданные, теги и другие сведения, связанные с каждым большим двоичным объектом).
  • ContainerClient.list_blob_names (возвращается только имя большого двоичного объекта)

Чтобы перечислить большие двоичные объекты в контейнере с помощью иерархического списка, вызовите следующий метод:

  • ContainerClient.walk_blobs (наряду с именем можно также включить метаданные, теги и другие сведения, связанные с каждым большим двоичным объектом).

Фильтрация результатов с помощью префикса

Чтобы отфильтровать список больших двоичных объектов, укажите строку для аргумента name_starts_with ключевое слово. Строка префикса может содержать один или несколько символов. Служба хранилища Azure возвращает только те большие двоичные объекты, имена которых начинаются с этого префикса.

Неструктурированный список и структурированный список

Большие двоичные объекты находятся в службе хранилища Azure в неструктурированном виде, без использования какой-либо иерархии (например, как в классической файловой системе). Однако большие двоичные объекты можно упорядочить по виртуальным каталогам, чтобы имитировать структуру папок. Виртуальный каталог образует часть имени большого двоичного объекта и обозначается символом-разделителем.

Чтобы упорядочить большие двоичные объекты по виртуальным каталогам, используйте символ-разделитель в имени большого двоичного объекта. Символом-разделителем по умолчанию является косая черта (/), однако в качестве разделителя можно указать любой символ.

Если присвоить большим двоичным объектам имена с использованием разделителя, можно выбрать получение структурированного списка больших двоичных объектов. Для этого служба хранилища Azure возвращает все виртуальные каталоги и большие двоичные объекты под родительским объектом. Операцию перечисления можно вызвать рекурсивно для прохода по иерархии, подобно тому, как осуществляется программный обход классической файловой системы.

Использование неструктурированного списка

По умолчанию операция перечисления возвращает большие двоичные объекты в виде неструктурированного списка. В неструктурированном списке большие двоичные объекты не организованы по виртуальному каталогу.

В следующем примере перечислены большие двоичные объекты в указанном контейнере с помощью неструктурированного списка:

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-объектов:

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'}

Примечание.

В примере выходных данных предполагается, что у вас есть учетная запись хранения с неструктурированным пространством имен. Если вы включили функцию иерархического пространства имен для учетной записи хранения, каталоги не являются виртуальными. Это будут реальные независимые объекты. В результате каталоги отображаются в списке как большие двоичные объекты нулевой длины.

Альтернативный вариант перечисления при работе с иерархическим пространством имен см. в разделе "Список содержимого каталога" (Azure Data Lake Storage 2-го поколения).

Использование иерархического списка

При вызове операции иерархического перечисления служба хранилища Azure возвращает виртуальные каталоги и большие двоичные объекты на первом уровне иерархии.

Чтобы перечислить большие двоичные объекты иерархически, используйте следующий метод:

В следующем примере перечислены большие двоичные объекты в указанном контейнере с помощью иерархического списка:

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

Примечание.

При выполнении операции иерархического перечисления не выводятся моментальные снимки больших двоичных объектов.

Перечисление больших двоичных объектов асинхронно

Клиентская библиотека Хранилище BLOB-объектов Azure для Python поддерживает асинхронное перечисление больших двоичных объектов. Дополнительные сведения о требованиях к настройке проекта см. в статье асинхронное программирование.

Выполните следующие действия, чтобы перечислить большие двоичные объекты с помощью асинхронных API:

  1. Добавьте в файл следующие операторы импорта:

    import asyncio
    
    from azure.identity.aio import DefaultAzureCredential
    from azure.storage.blob.aio import BlobServiceClient, ContainerClient, BlobPrefix
    
  2. Добавьте код для запуска программы с помощью asyncio.run. Эта функция запускает переданную корутину в main() нашем примере и управляет циклом asyncio событий. Корутины объявляются с синтаксисом async/await. В этом примере main() корутин сначала создает верхний уровень BlobServiceClient с помощью async with, а затем вызывает метод, который перечисляет большие двоичные объекты. Обратите внимание, что использовать только клиент верхнего уровня, так как другие клиенты, созданные из него, используют 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())
    
  3. Добавьте код для перечисления больших двоичных объектов. В следующем примере кода перечислены большие двоичные объекты с помощью неструктурированного списка. Код совпадает с синхронным примером, за исключением того, что метод объявляется с async ключевое слово и async for используется при вызове list_blobs метода.

    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.

Ресурсы

Дополнительные сведения о том, как перечислять большие двоичные объекты с помощью клиентской библиотеки Хранилище BLOB-объектов Azure для Python, см. в следующих ресурсах.

Операции REST API

Пакет SDK Azure для Python содержит библиотеки, которые создаются на основе REST API Azure, что позволяет взаимодействовать с операциями REST API с помощью знакомых парадигм Python. Методы клиентской библиотеки для перечисления БОЛЬШИХ двоичных объектов используют следующую операцию REST API:

Примеры кода

Ресурсы клиентской библиотеки

См. также