Compartir vía


Uso de Python para administrar directorios y archivos en Azure Data Lake Storage Gen2

En este artículo se explica cómo usar Python para crear y administrar directorios y archivos en cuentas de almacenamiento que tengan habilitado un espacio de nombres jerárquico.

Para obtener información sobre cómo obtener, establecer y actualizar las listas de control de acceso (ACL) de directorios y archivos, consulte Uso de Python para administrar listas de control de acceso en Azure Data Lake Storage Gen2.

Paquete (PyPi) | Muestras | Referencia de API | Asignación de Gen1 a Gen2 | Envíenos sus comentarios

Requisitos previos

Configurar su proyecto

En esta sección se explica cómo preparar un proyecto para que funcione con la biblioteca cliente de Azure Data Lake Storage para Python.

En el directorio del proyecto, instale los paquetes para las bibliotecas cliente de Azure Data Lake Storage y Azure Identity mediante el comando pip install. El paquete azure-identity es necesario para las conexiones sin contraseña a los servicios de Azure.

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

A continuación, abra el archivo de código y agregue las instrucciones de importación necesarias. En este ejemplo, agregamos lo siguiente al archivo .py:

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

Nota:

El acceso a varios protocolos en Data Lake Storage permite a las aplicaciones usar las API de blobs y las API de Data Lake Storage Gen2 para trabajar con datos en cuentas de almacenamiento con el espacio de nombres jerárquico (HNS) habilitado. Al trabajar con funcionalidades exclusivas de Data Lake Storage Gen2, como las operaciones de directorio y las ACL, use las API de Data Lake Storage Gen2, como se muestra en este artículo.

Al elegir qué API usar en un escenario determinado, tenga en cuenta la carga de trabajo y las necesidades de la aplicación, junto con los problemas conocidos y el impacto de HNS en cargas de trabajo y aplicaciones.

Autorización del acceso y conexión a recursos de datos

Para trabajar con los ejemplos de código de este artículo, debe crear una instancia DataLakeServiceClient autorizada que represente la cuenta de almacenamiento. Puede autorizar un objeto DataLakeServiceClient mediante Microsoft Entra ID, una clave de acceso de cuenta o una firma de acceso compartido (SAS).

Puede usar la biblioteca cliente de identidad de Azure para Python para autenticar la aplicación con Microsoft Entra ID.

Cree una instancia de la clase DataLakeServiceClient y pase un 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 más información sobre el uso de DefaultAzureCredential para autorizar el acceso a los datos, consulte Información general: Autenticación de aplicaciones de Python en Azure mediante el SDK de Azure.

Crear un contenedor

Un contenedor actúa como sistema de archivos para sus archivos. Puede crear un contenedor mediante el método siguiente:

En el ejemplo de código siguiente se crea un contenedor y se devuelve un objeto FileSystemClient para su 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

Creación de un directorio

Puede crear una referencia de directorio en el contenedor mediante el método siguiente:

En el ejemplo de código siguiente se agrega un directorio a un contenedor y se devuelve un objeto DataLakeDirectoryClient para su 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

Cambio de nombre o traslado de un directorio

Puede cambiar el nombre o mover un directorio mediante el método siguiente:

Pase la ruta de acceso con el nuevo nombre de directorio en el argumento new_name. El valor de tener el siguiente formato: {filesystem}/{directory}/{subdirectory}.

En el código de ejemplo siguiente, se muestra cómo cambiar el nombre de un subdirectorio:

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

Carga de un archivo en un directorio

Puede cargar contenido en un archivo nuevo o existente, mediante el método siguiente:

En el ejemplo de código siguiente se muestra cómo cargar un archivo en un directorio mediante el 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)

Puede usar este método para crear y cargar contenido en un archivo nuevo, o bien puede establecer el argumento overwrite en True para sobrescribir un archivo existente.

Anexión de datos a un archivo

Puede cargar los datos que se van a anexar a un archivo mediante el método siguiente:

En el ejemplo de código siguiente se muestra cómo anexar datos al final de un archivo mediante estos pasos:

  • Cree un objeto DataLakeFileClient para representar el recurso de archivo con el que está trabajando.
  • Cargue datos en el archivo mediante el método append_data.
  • Complete la carga llamando al método flush_data para escribir los datos cargados anteriormente en el archivo.
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))

Con este método, los datos solo se pueden anexar a un archivo y la operación está limitada a 4000 MiB por solicitud.

Descarga de un directorio

En el ejemplo de código siguiente se muestra cómo descargar un archivo de un directorio a un archivo local mediante estos pasos:

  • Cree un objeto DataLakeFileClient para representar el archivo que desea descargar.
  • Abra un archivo local para escritura.
  • Llame al método DataLakeFileClient.download_file para leer desde el archivo y, a continuación, escriba esos datos en el archivo 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()

Lista del contenido del directorio

Puede crear una lista del contenido del directorio mediante el método siguiente y enumerar el resultado:

La enumeración de las rutas de acceso en el resultado puede realizar varias solicitudes al servicio mientas captura los valores.

En el siguiente código de ejemplo se imprime la ruta de acceso de cada uno de los subdirectorios y archivos que se encuentran en un directorio:

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

Eliminación de un directorio

Puede eliminar un directorio mediante el método siguiente:

En el código de ejemplo siguiente, se muestra cómo eliminar un directorio:

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

Consulte también