Использование Python для управления каталогами и файлами в Azure Data Lake Storage
В этой статье показано, как использовать Python для создания каталогов и файлов в учетных записях хранения с иерархическим пространством имен, а также управления ими.
Сведения о том, как получить, задать и обновить списки управления доступом (ACL) каталогов и файлов, см. в статье "Использование Python для управления списками управления доступом" в Azure Data Lake Storage.
Справочник по | API примеров | пакета (PyPi) | 1-го поколения к сопоставлению | 2-го поколения
Необходимые компоненты
Подписка Azure. См. страницу бесплатной пробной версии Azure.
Учетная запись хранения с включенным иерархическим пространством имен. Выполните эти инструкции, чтобы создать учетную запись.
Настройка проекта
В этом разделе описывается подготовка проекта для работы с клиентской библиотекой Azure Data Lake Storage для Python.
В каталоге проекта установите пакеты для клиентских библиотек Azure Data Lake Storage и Azure Identity с помощью 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 Storage позволяет приложениям использовать 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)
Этот метод можно использовать для создания и отправки содержимого в новый файл или overwrite
True
для перезаписи существующего файла.
Добавление данных в файл
Данные можно добавить в файл с помощью следующего метода:
В следующем примере кода показано, как добавить данные в конец файла, выполнив следующие действия:
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()