Share via


Utiliser Python pour gérer les répertoires et les fichiers dans Azure Data Lake Storage Gen2

Cet article explique comment utiliser Python pour créer et gérer des répertoires et des fichiers dans les comptes de stockage dotés d’un espace de noms hiérarchique.

Pour en savoir plus sur la façon d’obtenir, de définir et de mettre à jour les listes de contrôle d’accès (ACL, Access Control List) des répertoires et des fichiers, consultez Utiliser Python pour gérer les listes de contrôle d’accès dans Azure Data Lake Storage Gen2.

Package (Pypi) | Exemples | Référence d’API | Mappage de Gen1 à Gen2 | Envoyer des commentaires

Prérequis

Configuration de votre projet

Cette section vous guide tout au long de la préparation d’un projet pour travailler avec la bibliothèque de client Azure Data Lake Storage pour Python.

À partir du répertoire du projet, installez les packages pour les bibliothèques de client Azure Data Lake Storage et Identité Azure en utilisant la commande pip install. Le package azure-identity est nécessaire pour les connexions sans mot de passe aux services Azure.

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

Ouvrez ensuite votre fichier de code, et ajoutez les instructions import nécessaires. Dans cet exemple, nous ajoutons ce qui suit à notre fichier .py :

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

Remarque

L’accès multiprotocole sur Data Lake Storage permet aux applications d’utiliser à la fois les API Blob et les API Data Lake Storage Gen2 pour travailler avec des données dans des comptes de stockage dont l’espace de noms hiérarchique (HNS) est activé. Lorsque vous travaillez avec des fonctionnalités propres à Data Lake Storage Gen2, telles que les opérations de répertoire et les ACL, utilisez les API de Data Lake Storage Gen2, comme indiqué dans cet article.

Lorsque vous choisissez les API à utiliser dans un scénario donné, tenez compte de la charge de travail et des besoins de votre application, ainsi que des problèmes connus et de l’impact de HNS sur les charges de travail et les applications.

Autoriser l’accès aux ressources de données et se connecter à celles-ci

Pour utiliser les exemples de code de cet article, vous devez créer une instance DataLakeServiceClient autorisée qui représente le compte de stockage. Vous pouvez autoriser un objet DataLakeServiceClient à l'aide de Microsoft Entra ID, d'une clé d'accès au compte ou d'une signature d'accès partagé (SAP).

Vous pouvez utiliser la bibliothèque de client Azure Identity pour Python afin d’authentifier votre application auprès de Microsoft Entra ID.

Créez une instance de la classe DataLakeServiceClient et passez un objet 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

Pour en savoir plus sur l’utilisation de DefaultAzureCredential pour autoriser l’accès aux données, consultez Vue d’ensemble : authentifier des applications Python sur Azure à l’aide du kit de développement logiciel (SDK) Azure.

Créez un conteneur.

Un conteneur fait office de système de fichiers pour vos fichiers. Vous pouvez créer un conteneur à l’aide de la méthode suivante :

L’exemple de code suivant crée un conteneur et retourne un objet FileSystemClient pour une utilisation ultérieure :

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

Créer un répertoire

Vous pouvez créer une référence de répertoire dans le conteneur à l’aide de la méthode suivante :

L’exemple de code suivant ajoute un répertoire à un conteneur et retourne un objet DataLakeDirectoryClient pour une utilisation ultérieure :

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

    return directory_client

Renommer ou déplacer un répertoire

Vous pouvez renommer ou déplacer un répertoire à l’aide de la méthode suivante :

Transmettez le chemin d’accès avec le nouveau nom de répertoire dans l’argument new_name. La valeur doit avoir le format suivant: {filesystem}/{répertoire}/{sous-répertoire}.

L’exemple de code suivant montre comment renommer un sous-répertoire :

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

Charger un fichier dans un répertoire

Vous pouvez charger un contenu dans un fichier nouveau ou existant à l’aide de la méthode suivante :

L’exemple de code suivant montre comment charger un fichier local dans un répertoire à l’aide de la méthode 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)

Vous pouvez utiliser cette méthode pour créer et charger un contenu dans un nouveau fichier, ou vous pouvez définir l’argument overwrite sur True pour remplacer un fichier existant.

Ajouter des données à un fichier

Vous pouvez charger des données à ajouter à un fichier à l’aide de la méthode suivante :

L’exemple de code suivant montre comment ajouter des données à la fin d’un fichier en procédant comme suit :

  • Créez un objet DataLakeFileClient pour représenter la ressource de fichier avec laquelle vous travaillez.
  • Chargez des données dans le fichier à l’aide de la méthode append_data.
  • Terminez le chargement en appelant la méthode flush_data pour écrire les données précédemment chargées dans le fichier.
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))

Avec cette méthode, les données ne peuvent être ajoutées qu’à un fichier et l’opération est limitée à 4 000 Mio par requête.

Télécharger à partir d’un répertoire

L’exemple de code suivant montre comment télécharger un fichier à partir d’un répertoire vers un fichier local en procédant comme suit :

  • Créez un objet DataLakeFileClient pour représenter le fichier que vous souhaitez télécharger.
  • Ouvrez un fichier local en écriture.
  • Appelez la méthode DataLakeFileClient.download_file pour lire à partir du fichier, puis écrire les données dans le fichier 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()

Afficher le contenu du répertoire

Vous pouvez répertorier le contenu d’un répertoire à l’aide de la méthode suivante et énumérer le résultat :

L’énumération des chemins d’accès dans le résultat peut faire plusieurs requêtes au service lors de l’extraction des valeurs.

L’exemple de code suivant imprime le chemin d’accès de chaque sous-répertoire et fichier qui se trouve dans un répertoire :

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

Supprimer un répertoire

Vous pouvez supprimer un répertoire à l’aide de la méthode suivante :

L’exemple de code suivant montre comment supprimer un répertoire :

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

Voir aussi