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
Suscripción a Azure. Consulte Obtención de una versión de evaluación gratuita.
Una cuenta de almacenamiento que tenga habilitado un espacio de nombres jerárquico. Siga estas instrucciones para crear uno.
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:
- DataLakeFileClient.append_data method.
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()