Entwickeln für Azure Files mit Python

Lernen Sie die Grundlagen der Verwendung von Python zur Entwicklung von Apps oder Diensten kennen, die Azure Files zum Speichern von Dateidaten verwenden. Erstellen Sie eine Konsolen-App, und erfahren Sie, wie Sie grundlegende Aktionen mit Python und Azure Files durchführen können:

  • Erstellen von Azure-Dateifreigaben
  • Erstellen von Verzeichnissen
  • Auflisten von Dateien und Verzeichnissen in einer Azure-Dateifreigabe
  • Hochladen, Herunterladen und Löschen einer Datei
  • Erstellen von Dateifreigabesicherungen mithilfe von Momentaufnahmen

Hinweis

Da auf Azure Files über das SMB-Protokoll zugegriffen werden kann, können Sie unter Verwendung der standardmäßigen Python-E/A-Klassen und -Funktionen einfache Anwendungen mit Zugriff auf die Azure-Dateifreigabe schreiben. In diesem Artikel erfahren Sie, wie Sie Apps schreiben, die das Azure Storage SDK für Python verwenden, das über die Azure Files-REST-API mit Azure Files kommuniziert.

Gilt für:

Dateifreigabetyp SMB NFS
Standard-Dateifreigaben (GPv2), LRS/ZRS Yes No
Standard-Dateifreigaben (GPv2), GRS/GZRS Yes No
Premium-Dateifreigaben (FileStorage), LRS/ZRS Yes No

Herunterladen und Installieren des Azure Storage SDK für Python

Hinweis

Wenn Sie ein Upgrade aus dem Azure Storage SDK für Python Version 0.36 oder früher vornehmen, deinstallieren Sie das ältere SDK mit pip uninstall azure-storage, bevor Sie das neueste Paket installieren.

Für die Azure Files-Clientbibliothek für Python ist Python 3.8 oder höher erforderlich.

Installieren über PyPI

Geben Sie für die Installation über Python Package Index (PyPI) folgenden Befehl ein:

pip install azure-storage-file-share

Einrichten der Anwendung für die Verwendung von Azure Files

Fügen Sie den folgenden Code nahe dem Anfang einer Python-Quelldatei hinzu, um die Codeschnipsel in diesem Artikel zu verwenden.

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

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

Einrichten der Verbindung mit Azure Files

Mit ShareServiceClient können Sie mit Freigaben, Verzeichnissen und Dateien arbeiten. Dieser Code erstellt mithilfe der Verbindungszeichenfolge für das Speicherkonto ein ShareServiceClient-Objekt:

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

Erstellen einer Azure-Dateifreigabe

Im folgenden Codebeispiel wird mithilfe eines ShareClient-Objekts die Freigabe erstellt, wenn sie nicht vorhanden ist.

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)

Erstellen eines Verzeichnisses

Sie können den Speicher organisieren, indem Sie Dateien in Unterverzeichnissen ablegen, anstatt alle Dateien im Stammverzeichnis zu speichern.

Die folgende Methode erstellt ein Verzeichnis im Stammverzeichnis der angegebenen Dateifreigabe mithilfe eines ShareDirectoryClient-Objekts.

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)

Hochladen einer Datei

In diesem Abschnitt erfahren Sie, wie Sie eine Datei aus dem lokalen Speicher in Azure Files hochladen können.

Mit der folgenden Methode wird der Inhalt der angegebenen Datei in das angegebene Verzeichnis in der angegebenen Azure-Dateifreigabe hochgeladen.

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)

Auflisten von Dateien und Verzeichnissen in einer Azure-Dateifreigabe

Um die Dateien und Verzeichnisse in einem Unterverzeichnis aufzulisten, verwenden Sie die Methode list_directories_and_files. Diese Methode liefert ein iterierbares Objekt für das automatische Paging zurück. Der folgende Code gibt den Namen der einzelnen Dateien und Unterverzeichnisse im angegebenen Verzeichnis an die Konsole aus.

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)

Herunterladen einer Datei

Verwenden Sie zum Herunterladen von Daten aus einer Datei download_file.

Das folgende Beispiel veranschaulicht die Verwendung von download_file, um den Inhalt der angegebenen Datei abzurufen und lokal zu speichern, wobei dem Dateinamen DOWNLOADED- vorangestellt wird.

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)

Erstellen einer Freigabemomentaufnahme

Sie können eine Zeitpunktkopie Ihrer gesamten Dateifreigabe erstellen.

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)

Auflisten von Freigaben und Momentaufnahmen

Sie können alle Momentaufnahmen für eine bestimmte Freigabe auflisten.

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)

Durchsuchen einer Freigabemomentaufnahme

Sie können die einzelnen Freigabemomentaufnahmen durchsuchen, um Dateien und Verzeichnisse von diesem Zeitpunkt abzurufen.

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)

Abrufen einer Datei aus einer Freigabemomentaufnahme

Sie können eine Datei von einer freigegebenen Momentaufnahme herunterladen, mit der Sie eine frühere Version einer Datei wiederherstellen können.

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)

Löschen einer einzelnen Freigabemomentaufnahme

Sie können eine einzelne Freigabemomentaufnahme löschen.

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)

Löschen von Dateien

Rufen Sie delete_file auf, um eine Datei zu löschen.

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)

Löschen einer Freigabe bei vorhandenen Freigabemomentaufnahmen

Zum Löschen einer Freigabe, die Momentaufnahmen enthält, rufen Sie delete_share mit delete_snapshots=True auf.

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)

Nächste Schritte

Nachdem Sie sich mit dem Bearbeiten von Azure Files mit Python vertraut gemacht haben, folgen Sie diesen Links, um mehr zu erfahren.

Verwandte Codebeispiele, in denen veraltete Python Version 2 SDKs verwendet werden, finden Sie unter Codebeispiele mit der Python Version 2.