azure-storage-file-datalake-py

npx skills add https://github.com/microsoft/skills --skill azure-storage-file-datalake-py

Kit de développement Azure Data Lake Storage Gen2 pour Python

Système de fichiers hiérarchique pour les charges de travail d'analyse de mégadonnées.

Installation

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

Variables d'environnement

AZURE_STORAGE_ACCOUNT_URL=https://<account>.dfs.core.windows.net  # Obligatoire pour toutes les méthodes d'authentification
AZURE_TOKEN_CREDENTIALS=prod # Obligatoire uniquement si DefaultAzureCredential est utilisé en production

Authentification

from azure.identity import DefaultAzureCredential, ManagedIdentityCredential
from azure.storage.filedatalake import DataLakeServiceClient

# Dev local : DefaultAzureCredential. Production : définir AZURE_TOKEN_CREDENTIALS=prod ou AZURE_TOKEN_CREDENTIALS=<specific_credential>
credential = DefaultAzureCredential(require_envvar=True)
# Ou utiliser une credential spécifique directement en production :
# Voir https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes
# credential = ManagedIdentityCredential()
account_url = "https://<account>.dfs.core.windows.net"

service_client = DataLakeServiceClient(account_url=account_url, credential=credential)

Hiérarchie des clients

Client Objectif
DataLakeServiceClient Opérations au niveau du compte
FileSystemClient Opérations de conteneur (système de fichiers)
DataLakeDirectoryClient Opérations sur les répertoires
DataLakeFileClient Opérations sur les fichiers

Opérations sur le système de fichiers

# Créer un système de fichiers (conteneur)
file_system_client = service_client.create_file_system("myfilesystem")

# Obtenir un système de fichiers existant
file_system_client = service_client.get_file_system_client("myfilesystem")

# Supprimer
service_client.delete_file_system("myfilesystem")

# Lister les systèmes de fichiers
for fs in service_client.list_file_systems():
    print(fs.name)

Opérations sur les répertoires

file_system_client = service_client.get_file_system_client("myfilesystem")

# Créer un répertoire
directory_client = file_system_client.create_directory("mydir")

# Créer des répertoires imbriqués
directory_client = file_system_client.create_directory("path/to/nested/dir")

# Obtenir un client de répertoire
directory_client = file_system_client.get_directory_client("mydir")

# Supprimer un répertoire
directory_client.delete_directory()

# Renommer/déplacer un répertoire
directory_client.rename_directory(new_name="myfilesystem/newname")

Opérations sur les fichiers

Charger un fichier

# Obtenir un client de fichier
file_client = file_system_client.get_file_client("path/to/file.txt")

# Charger depuis un fichier local
with open("local-file.txt", "rb") as data:
    file_client.upload_data(data, overwrite=True)

# Charger des octets
file_client.upload_data(b"Hello, Data Lake!", overwrite=True)

# Ajouter des données (pour les fichiers volumineux)
file_client.append_data(data=b"chunk1", offset=0, length=6)
file_client.append_data(data=b"chunk2", offset=6, length=6)
file_client.flush_data(12)  # Valider les données

Télécharger un fichier

file_client = file_system_client.get_file_client("path/to/file.txt")

# Télécharger tout le contenu
download = file_client.download_file()
content = download.readall()

# Télécharger vers un fichier
with open("downloaded.txt", "wb") as f:
    download = file_client.download_file()
    download.readinto(f)

# Télécharger une plage
download = file_client.download_file(offset=0, length=100)

Supprimer un fichier

file_client.delete_file()

Lister les contenus

# Lister les chemins (fichiers et répertoires)
for path in file_system_client.get_paths():
    print(f"{'DIR' if path.is_directory else 'FILE'}: {path.name}")

# Lister les chemins dans un répertoire
for path in file_system_client.get_paths(path="mydir"):
    print(path.name)

# Listage récursif
for path in file_system_client.get_paths(path="mydir", recursive=True):
    print(path.name)

Propriétés des fichiers/répertoires

# Obtenir les propriétés
properties = file_client.get_file_properties()
print(f"Size: {properties.size}")
print(f"Last modified: {properties.last_modified}")

# Définir les métadonnées
file_client.set_metadata(metadata={"processed": "true"})

Contrôle d'accès (ACL)

# Obtenir l'ACL
acl = directory_client.get_access_control()
print(f"Owner: {acl['owner']}")
print(f"Permissions: {acl['permissions']}")

# Définir l'ACL
directory_client.set_access_control(
    owner="user-id",
    permissions="rwxr-x---"
)

# Mettre à jour les entrées ACL
from azure.storage.filedatalake import AccessControlChangeResult
directory_client.update_access_control_recursive(
    acl="user:user-id:rwx"
)

Client asynchrone

from azure.storage.filedatalake.aio import DataLakeServiceClient
from azure.identity.aio import DefaultAzureCredential

async def datalake_operations():
    credential = DefaultAzureCredential()

    async with DataLakeServiceClient(
        account_url="https://<account>.dfs.core.windows.net",
        credential=credential
    ) as service_client:
        file_system_client = service_client.get_file_system_client("myfilesystem")
        file_client = file_system_client.get_file_client("test.txt")

        await file_client.upload_data(b"async content", overwrite=True)

        download = await file_client.download_file()
        content = await download.readall()

import asyncio
asyncio.run(datalake_operations())

Bonnes pratiques

  1. Utiliser l'espace de noms hiérarchique pour la sémantique du système de fichiers
  2. Utiliser append_data + flush_data pour les chargements de fichiers volumineux
  3. Définir les ACL au niveau du répertoire et les hériter pour les enfants
  4. Utiliser le client asynchrone pour les scénarios à haut débit
  5. Utiliser get_paths avec recursive=True pour le listage complet des répertoires
  6. Définir des métadonnées pour les attributs de fichiers personnalisés
  7. Considérer l'API Blob pour les cas d'usage simples de stockage d'objets

Skills similaires