Développement pour Azure Files avec Python

Découvrez les notions de base pour développer en Python des applications ou des services qui stockent les données de fichiers avec Azure Files. Créer une application de console et apprendre à effectuer des actions de base avec Python et Azure Files :

  • Créer des partages de fichiers Azure
  • Créer des répertoires
  • Énumérer des fichiers et répertoires dans un partage de fichiers Azure
  • Charger, télécharger et supprimer un fichier
  • Créer des sauvegardes de partages de fichiers à l’aide d’instantanés

Notes

Comme Azure Files est accessible sur SMB, vous pouvez écrire des applications simples qui accèdent au partage de fichiers Azure à l’aide des fonctions et classes d’E/S Python standard. Cet article explique comment écrire des applications qui utilisent le kit de développement logiciel (SDK) pour Python du Stockage Azure, lequel s’appuie sur l’API REST Azure Files pour communiquer avec Azure Files.

S’applique à

Type de partage de fichiers SMB NFS
Partages de fichiers Standard (GPv2), LRS/ZRS Yes No
Partages de fichiers Standard (GPv2), GRS/GZRS Yes No
Partages de fichiers Premium (FileStorage), LRS/ZRS Yes No

Télécharger et installer le SDK Stockage Azure pour Python

Notes

Si vous mettez à niveau la version 0.36 ou antérieure du SDK Stockage Azure pour Python, désinstallez l’ancien SDK à l’aide de pip uninstall azure-storage avant d’installer le dernier package.

La bibliothèque de client Azure Files pour Python nécessite Python 3.8+.

Effectuer l'installation via PyPi

Pour effectuer l’installation via PyPI (Python Package Index), tapez :

pip install azure-storage-file-share

Configurer votre application pour utiliser Azure Files

Ajoutez le code suivant au début d’un fichier source Python pour pouvoir utiliser les extraits de code de cet article.

from azure.core.exceptions import (
    ResourceExistsError,
    ResourceNotFoundError
)

from azure.storage.fileshare import (
    ShareServiceClient,
    ShareClient,
    ShareDirectoryClient,
    ShareFileClient
)

Configurer une connexion à Azure Files

ShareServiceClient permet d’utiliser des partages, des répertoires et des fichiers. Le code crée un objet ShareServiceClient à l’aide de la chaîne de connexion du compte de stockage :

# Create a ShareServiceClient from a connection string
service_client = ShareServiceClient.from_connection_string(connection_string)

Créer un partage de fichiers Azure

L’exemple de code suivant utilise un objet ShareClient pour créer le partage s’il n’existe pas.

def create_file_share(self, connection_string, share_name):
    try:
        # Create a ShareClient from a connection string
        share_client = ShareClient.from_connection_string(
            connection_string, share_name)

        print("Creating share:", share_name)
        share_client.create_share()

    except ResourceExistsError as ex:
        print("ResourceExistsError:", ex.message)

Créer un répertoire

Vous pouvez organiser le stockage en plaçant des fichiers dans des sous-répertoires, plutôt que de tous les mettre dans le répertoire racine.

La méthode suivante permet de créer un répertoire à la racine du partage de fichiers spécifié à l’aide d’un objet ShareDirectoryClient.

def create_directory(self, connection_string, share_name, dir_name):
    try:
        # Create a ShareDirectoryClient from a connection string
        dir_client = ShareDirectoryClient.from_connection_string(
            connection_string, share_name, dir_name)

        print("Creating directory:", share_name + "/" + dir_name)
        dir_client.create_directory()

    except ResourceExistsError as ex:
        print("ResourceExistsError:", ex.message)

Charger un fichier

Dans cette section, vous apprenez comment charger un fichier à partir du stockage local vers Azure Files.

La méthode suivante permet de charger le contenu du fichier spécifié dans le répertoire indiqué au sein du partage de fichiers Azure prévu.

def upload_local_file(self, connection_string, local_file_path, share_name, dest_file_path):
    try:
        source_file = open(local_file_path, "rb")
        data = source_file.read()

        # Create a ShareFileClient from a connection string
        file_client = ShareFileClient.from_connection_string(
            connection_string, share_name, dest_file_path)

        print("Uploading to:", share_name + "/" + dest_file_path)
        file_client.upload_file(data)

    except ResourceExistsError as ex:
        print("ResourceExistsError:", ex.message)

    except ResourceNotFoundError as ex:
        print("ResourceNotFoundError:", ex.message)

Énumérer des fichiers et répertoires dans un partage de fichiers Azure

Pour lister les fichiers et les répertoires d’un sous-répertoire, utilisez la méthode list_directories_and_files. Cette méthode retourne un itérable à pagination automatique. Le code suivant donne en sortie dans la console le nom de chacun des fichiers et répertoires du répertoire spécifié.

def list_files_and_dirs(self, connection_string, share_name, dir_name):
    try:
        # Create a ShareClient from a connection string
        share_client = ShareClient.from_connection_string(
            connection_string, share_name)

        for item in list(share_client.list_directories_and_files(dir_name)):
            if item["is_directory"]:
                print("Directory:", item["name"])
            else:
                print("File:", dir_name + "/" + item["name"])

    except ResourceNotFoundError as ex:
        print("ResourceNotFoundError:", ex.message)

Téléchargement d’un fichier

Pour télécharger des données à partir d’un fichier, utilisez download_file.

L’exemple suivant montre comment utiliser download_file pour récupérer le contenu du fichier spécifié et le stocker localement en ajoutant le préfixe DOWNLOADED- au nom de fichier.

def download_azure_file(self, connection_string, share_name, dir_name, file_name):
    try:
        # Build the remote path
        source_file_path = dir_name + "/" + file_name

        # Add a prefix to the filename to 
        # distinguish it from the uploaded file
        dest_file_name = "DOWNLOADED-" + file_name

        # Create a ShareFileClient from a connection string
        file_client = ShareFileClient.from_connection_string(
            connection_string, share_name, source_file_path)

        print("Downloading to:", dest_file_name)

        # Open a file for writing bytes on the local system
        with open(dest_file_name, "wb") as data:
            # Download the file from Azure into a stream
            stream = file_client.download_file()
            # Write the stream to the local file
            data.write(stream.readall())

    except ResourceNotFoundError as ex:
        print("ResourceNotFoundError:", ex.message)

Créer un instantané de partage

Vous pouvez créer une copie à un point dans le temps de la totalité de votre partage de fichier.

def create_snapshot(self, connection_string, share_name):
    try:
        # Create a ShareClient from a connection string
        share_client = ShareClient.from_connection_string(
            connection_string, share_name)

        # Create a snapshot
        snapshot = share_client.create_snapshot()
        print("Created snapshot:", snapshot["snapshot"])

        # Return the snapshot time so 
        # it can be accessed later
        return snapshot["snapshot"]

    except ResourceNotFoundError as ex:
        print("ResourceNotFoundError:", ex.message)

Répertorier les partages et les instantanés

Vous pouvez répertorier tous les instantanés pour un partage particulier.

def list_shares_snapshots(self, connection_string):
    try:
        # Create a ShareServiceClient from a connection string
        service_client = ShareServiceClient.from_connection_string(connection_string)

        # List the shares in the file service
        shares = list(service_client.list_shares(include_snapshots=True))

        for share in shares:
            if (share["snapshot"]):
                print("Share:", share["name"], "Snapshot:", share["snapshot"])
            else:
                print("Share:", share["name"])

    except ResourceNotFoundError as ex:
        print("ResourceNotFoundError:", ex.message)

Parcourir un instantané de partage

Vous pouvez parcourir chaque instantané de partage pour récupérer les fichiers et les répertoires du point dans le temps correspondant.

def browse_snapshot_dir(self, connection_string, share_name, snapshot_time, dir_name):
    try:
        # Create a ShareClient from a connection string
        snapshot = ShareClient.from_connection_string(
            conn_str=connection_string, share_name=share_name, snapshot=snapshot_time)

        print("Snapshot:", snapshot_time)

        for item in list(snapshot.list_directories_and_files(dir_name)):
            if item["is_directory"]:
                print("Directory:", item["name"])
            else:
                print("File:", dir_name + "/" + item["name"])

    except ResourceNotFoundError as ex:
        print("ResourceNotFoundError:", ex.message)

Récupérer un fichier d’un instantané de partage

Vous pouvez télécharger un fichier à partir d’un instantané de partage, ce qui vous permet de restaurer une version précédente d’un fichier.

def download_snapshot_file(self, connection_string, share_name, snapshot_time, dir_name, file_name):
    try:
        # Build the remote path
        source_file_path = dir_name + "/" + file_name

        # Add a prefix to the local filename to 
        # indicate it's a file from a snapshot
        dest_file_name = "SNAPSHOT-" + file_name

        # Create a ShareFileClient from a connection string
        snapshot_file_client = ShareFileClient.from_connection_string(
            conn_str=connection_string, share_name=share_name, 
            file_path=source_file_path, snapshot=snapshot_time)

        print("Downloading to:", dest_file_name)

        # Open a file for writing bytes on the local system
        with open(dest_file_name, "wb") as data:
            # Download the file from Azure into a stream
            stream = snapshot_file_client.download_file()
            # Write the stream to the local file
            data.write(stream.readall())

    except ResourceNotFoundError as ex:
        print("ResourceNotFoundError:", ex.message)

Supprimer un instantané de partage spécifique

Vous pouvez supprimer un instantané de partage spécifique.

def delete_snapshot(self, connection_string, share_name, snapshot_time):
    try:
        # Create a ShareClient for a snapshot
        snapshot_client = ShareClient.from_connection_string(conn_str=connection_string, share_name=share_name, snapshot=snapshot_time)

        print("Deleting snapshot:", snapshot_time)

        # Delete the snapshot
        snapshot_client.delete_share()

    except ResourceNotFoundError as ex:
        print("ResourceNotFoundError:", ex.message)

Supprimer un fichier

Pour supprimer un fichier, appelez delete_file.

def delete_azure_file(self, connection_string, share_name, file_path):
    try:
        # Create a ShareFileClient from a connection string
        file_client = ShareFileClient.from_connection_string(
            connection_string, share_name, file_path)

        print("Deleting file:", share_name + "/" + file_path)

        # Delete the file
        file_client.delete_file()

    except ResourceNotFoundError as ex:
        print("ResourceNotFoundError:", ex.message)

Supprimer un partage quand existent des instantanés de partage

Pour supprimer un partage contenant des instantanés, appelez delete_share avec delete_snapshots=True.

def delete_share(self, connection_string, share_name):
    try:
        # Create a ShareClient from a connection string
        share_client = ShareClient.from_connection_string(
            connection_string, share_name)

        print("Deleting share:", share_name)

        # Delete the share and snapshots
        share_client.delete_share(delete_snapshots=True)

    except ResourceNotFoundError as ex:
        print("ResourceNotFoundError:", ex.message)

Étapes suivantes

Maintenant que vous avez appris comment manipuler Azure Files avec Python, suivez ces liens pour en savoir plus.

Pour obtenir des exemples de code associés utilisant des Kits de développement logiciel (SDK) Python version 2 déconseillés, consultez l’article Exemples de code utilisant Python version 2.