Utilisez Python pour gérer les répertoires et les fichiers dans Azure Data Lake Storage
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) des répertoires et des fichiers, consultez Utiliser Python pour gérer les ACL dans Azure Data Lake Storage.
Package (Pypi) | Exemples | Référence d’API | Mappage de Gen1 à Gen2 | Envoyer des commentaires
Prérequis
Un abonnement Azure. Consultez la page Obtention d’un essai gratuit d’Azure.
Un compte de stockage qui a un espace de noms hiérarchique activé. Pour créer un test, suivez ces instructions.
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 utiliser 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 listes 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 :
- Méthode DataLakeFileClient.append_data.
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()