Usar Python para gerenciar diretórios e arquivos no Azure Data Lake Storage Gen2

Este artigo mostra como usar Python para criar e gerenciar diretórios e arquivos em contas de armazenamento que têm um namespace hierárquico.

Para saber como obter, definir e atualizar as listas de controle de acesso (ACL) de diretórios e arquivos, consulte Usar Python para gerenciar ACLs no Azure Data Lake Storage Gen2.

Pacote (PyPi) | Exemplos | API referência | Gen1 para Gen2 mapeamento | Dar feedback

Pré-requisitos

Configure o seu projeto

Esta seção orienta você na preparação de um projeto para trabalhar com a biblioteca de cliente do Armazenamento do Azure Data Lake para Python.

No diretório do projeto, instale pacotes para o Armazenamento do Azure Data Lake e as bibliotecas de cliente do Azure Identity usando o pip install comando. O pacote azure-identity é necessário para conexões sem senha com os serviços do Azure.

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

Em seguida, abra o arquivo de código e adicione as instruções de importação necessárias. Neste exemplo, adicionamos o seguinte ao nosso arquivo .py :

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

Nota

O acesso multiprotocolo no Data Lake Storage permite que os aplicativos usem APIs de Blob e APIs do Data Lake Storage Gen2 para trabalhar com dados em contas de armazenamento com namespace hierárquico (HNS) habilitado. Ao trabalhar com recursos exclusivos do Data Lake Storage Gen2, como operações de diretório e ACLs, use as APIs do Data Lake Storage Gen2, conforme mostrado neste artigo.

Ao escolher quais APIs usar em um determinado cenário, considere a carga de trabalho e as necessidades do seu aplicativo, juntamente com os problemas conhecidos e o impacto do HNS em cargas de trabalho e aplicativos.

Autorizar o acesso e conectar-se a recursos de dados

Para trabalhar com os exemplos de código neste artigo, você precisa criar uma instância DataLakeServiceClient autorizada que represente a conta de armazenamento. Você pode autorizar um objeto usando o DataLakeServiceClient Microsoft Entra ID, uma chave de acesso de conta ou uma assinatura de acesso compartilhado (SAS).

Você pode usar a biblioteca de cliente de identidade do Azure para Python para autenticar seu aplicativo com o Microsoft Entra ID.

Crie uma instância da classe DataLakeServiceClient e passe um objeto 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

Para saber mais sobre como usar DefaultAzureCredential para autorizar o acesso a dados, consulte Visão geral: autenticar aplicativos Python no Azure usando o SDK do Azure.

Criar um contentor

Um contêiner atua como um sistema de arquivos para seus arquivos. Você pode criar um contêiner usando o seguinte método:

O exemplo de código a seguir cria um contêiner e retorna um FileSystemClient objeto para uso posterior:

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

Criar um diretório

Você pode criar uma referência de diretório no contêiner usando o seguinte método:

O exemplo de código a seguir adiciona um diretório a um contêiner e retorna um DataLakeDirectoryClient objeto para uso posterior:

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

    return directory_client

Renomear ou mover um diretório

Você pode renomear ou mover um diretório usando o seguinte método:

Passe o caminho com o novo nome do new_name diretório no argumento. O valor deve ter o seguinte formato: {filesystem}/{directory}/{subdirectory}.

O exemplo de código a seguir mostra como renomear um subdiretório:

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}")

Carregar um ficheiro para um diretório

Você pode carregar conteúdo para um arquivo novo ou existente usando o seguinte método:

O exemplo de código a seguir mostra como carregar um arquivo para um diretório usando o método 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)

Você pode usar esse método para criar e carregar conteúdo para um novo arquivo ou pode definir o overwrite argumento para True substituir um arquivo existente.

Acrescentar dados a um ficheiro

Você pode carregar dados a serem anexados a um arquivo usando o seguinte método:

  • DataLakeFileClient.append_data método.

O exemplo de código a seguir mostra como acrescentar dados ao final de um arquivo usando estas etapas:

  • Crie um DataLakeFileClient objeto para representar o recurso de arquivo com o qual você está trabalhando.
  • Carregue dados para o arquivo usando o método append_data .
  • Conclua o upload chamando o método flush_data para gravar os dados carregados anteriormente no arquivo.
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))

Com esse método, os dados só podem ser anexados a um arquivo e a operação é limitada a 4000 MiB por solicitação.

Download de um diretório

O exemplo de código a seguir mostra como baixar um arquivo de um diretório para um arquivo local usando estas etapas:

  • Crie um DataLakeFileClient objeto para representar o arquivo que você deseja baixar.
  • Abra um arquivo local para gravação.
  • Chame o método DataLakeFileClient.download_file para ler o arquivo e, em seguida, grave os dados no arquivo local.
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()

Listar conteúdo do diretório

Você pode listar o conteúdo do diretório usando o seguinte método e enumerando o resultado:

Enumerar os caminhos no resultado pode fazer várias solicitações para o serviço ao buscar os valores.

O exemplo de código a seguir imprime o caminho de cada subdiretório e arquivo localizado em um diretório:

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

Eliminar um diretório

Você pode excluir um diretório usando o seguinte método:

O exemplo de código a seguir mostra como excluir um diretório:

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

Consulte também