Управление каталогами и файлами в Azure Data Lake Storage 2-го поколения с помощью Python

В этой статье показано, как использовать Python для создания каталогов и файлов в учетных записях хранения с иерархическим пространством имен, а также управления ими.

Дополнительные сведения о получении, установке и обновлении списков управления доступом (ACL) для каталогов и файлов см. в разделе Использование Python для управления списками ACL в Azure Data Lake Storage 2-го поколения.

Справочник по | API примеров | пакета (PyPi) | 1-го поколения к сопоставлению | 2-го поколения

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

Настройка проекта

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

В каталоге проекта установите пакеты для клиентских библиотек Azure Data Lake служба хранилища и удостоверений Azure с помощью pip install команды. Пакет azure-identity необходим для бессерверных подключений к службам Azure.

pip install azure-storage-file-datalake azure-identity

Затем откройте файл кода и добавьте необходимые инструкции импорта. В этом примере мы добавим следующее в файл .py :

import os
from azure.storage.filedatalake import (
    DataLakeServiceClient,
    DataLakeDirectoryClient,
    FileSystemClient
)
from azure.identity import DefaultAzureCredential

Примечание.

Доступ с несколькими протоколами в Data Lake служба хранилища позволяет приложениям использовать API BLOB-объектов и DATA LAKE STORAGE 2-ГО ПОКОЛЕНИЯ API для работы с данными в учетных записях хранения с включенным иерархическим пространством имен (HNS). При работе с возможностями, уникальными для Data Lake Storage 2-го поколения, таких как операции каталогов и списки управления доступом, используйте API Data Lake Storage 2-го поколения, как показано в этой статье.

При выборе API для использования в данном сценарии рассмотрите рабочую нагрузку и потребности приложения, а также известные проблемыи влияние HNS на рабочие нагрузки и приложения.

Авторизация доступа к ресурсам данных и подключение к ним

Для работы с примерами кода в этой статье необходимо создать авторизованный экземпляр DataLakeServiceClient , представляющий учетную запись хранения. Вы можете авторизовать DataLakeServiceClient объект с помощью идентификатора Microsoft Entra, ключа доступа к учетной записи или подписанного URL-адреса (SAS).

Клиентская библиотека удостоверений Azure для Python используется для проверки подлинности приложения с помощью идентификатора Microsoft Entra.

Создайте экземпляр класса DataLakeServiceClient и передайте его в объект DefaultAzureCredential.

def get_service_client_token_credential(self, account_name) -> DataLakeServiceClient:
    account_url = f"https://{account_name}.dfs.core.windows.net"
    token_credential = DefaultAzureCredential()

    service_client = DataLakeServiceClient(account_url, credential=token_credential)

    return service_client

Дополнительные сведения об использовании DefaultAzureCredential для авторизации доступа к данным см. в статье "Обзор: проверка подлинности приложений Python в Azure с помощью пакета SDK Azure".

Создание контейнера

Контейнер выступает в качестве файловой системы для файлов. Контейнер можно создать с помощью следующего метода:

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

def create_file_system(self, service_client: DataLakeServiceClient, file_system_name: str) -> FileSystemClient:
    file_system_client = service_client.create_file_system(file_system=file_system_name)

    return file_system_client

Создание каталога

Ссылку на каталог в контейнере можно создать с помощью следующего метода:

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

def create_directory(self, file_system_client: FileSystemClient, directory_name: str) -> DataLakeDirectoryClient:
    directory_client = file_system_client.create_directory(directory_name)

    return directory_client

Переименование или перемещение каталога

Вы можете переименовать или переместить каталог с помощью следующего метода:

Передайте путь с новым именем каталога в аргументе new_name . Значение должно иметь следующий формат: {filesystem}/{directory}/{subdirectory}.

В следующем примере кода показано, как переименовать подкаталог:

def rename_directory(self, directory_client: DataLakeDirectoryClient, new_dir_name: str):
    directory_client.rename_directory(
        new_name=f"{directory_client.file_system_name}/{new_dir_name}")

Отправка файла в каталог

Вы можете передать содержимое в новый или существующий файл с помощью следующего метода:

В следующем примере кода показано, как отправить файл в каталог с помощью метода upload_data :

def upload_file_to_directory(self, directory_client: DataLakeDirectoryClient, local_path: str, file_name: str):
    file_client = directory_client.get_file_client(file_name)

    with open(file=os.path.join(local_path, file_name), mode="rb") as data:
        file_client.upload_data(data, overwrite=True)

Этот метод можно использовать для создания и отправки содержимого в новый файл или overwriteTrue для перезаписи существующего файла.

Добавление данных в файл

Данные можно добавить в файл с помощью следующего метода:

  • метод DataLakeFileClient.append_data.

В следующем примере кода показано, как добавить данные в конец файла, выполнив следующие действия:

  • DataLakeFileClient Создайте объект для представления файлового ресурса, с которым вы работаете.
  • Отправьте данные в файл с помощью метода append_data .
  • Завершите отправку, вызвав метод flush_data для записи ранее отправленных данных в файл.
def append_data_to_file(self, directory_client: DataLakeDirectoryClient, file_name: str):
    file_client = directory_client.get_file_client(file_name)
    file_size = file_client.get_file_properties().size
    
    data = b"Data to append to end of file"
    file_client.append_data(data, offset=file_size, length=len(data))

    file_client.flush_data(file_size + len(data))

С помощью этого метода данные могут быть добавлены только к файлу, и операция ограничена 4000 МиБ на запрос.

Скачивание из каталога

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

  • DataLakeFileClient Создайте объект для представления файла, который требуется скачать.
  • Откройте локальный файл для записи.
  • Вызовите метод DataLakeFileClient.download_file, чтобы прочитать из файла, а затем записать данные в локальный файл.
def download_file_from_directory(self, directory_client: DataLakeDirectoryClient, local_path: str, file_name: str):
    file_client = directory_client.get_file_client(file_name)

    with open(file=os.path.join(local_path, file_name), mode="wb") as local_file:
        download = file_client.download_file()
        local_file.write(download.readall())
        local_file.close()

Вывод содержимого каталогов

Вы можете перечислить содержимое каталога с помощью следующего метода и перечисления результата:

Перечисление путей в результате может выполнять несколько запросов к службе при выборе значений.

В следующем примере кода выводится путь к каждому подкаталогу и файлу, расположенному в каталоге:

def list_directory_contents(self, file_system_client: FileSystemClient, directory_name: str):
    paths = file_system_client.get_paths(path=directory_name)

    for path in paths:
        print(path.name + '\n')

Удаление каталога

Вы можете удалить каталог с помощью следующего метода:

В следующем примере кода показано, как удалить каталог:

def delete_directory(self, directory_client: DataLakeDirectoryClient):
    directory_client.delete_directory()

См. также