Ontwikkelen voor Azure Files met Python

Meer informatie over de basisbeginselen van het gebruik van Python voor het ontwikkelen van apps of services die gebruikmaken van Azure Files om bestandsgegevens op te slaan. Maak een console-app en leer hoe u basisacties uitvoert met Python en Azure Files:

  • Azure-bestandsshares maken
  • Directory's maken
  • Bestanden en mappen opsommen in een Azure-bestandsshare
  • Een bestand uploaden, downloaden en verwijderen
  • Back-ups van bestandsshares maken met behulp van momentopnamen

Notitie

Omdat Azure Files toegankelijk is via SMB, is het mogelijk om eenvoudige toepassingen te schrijven die toegang hebben tot de Azure-bestandsshare met behulp van de standaard Python I/O-klassen en -functies. In dit artikel wordt beschreven hoe u apps schrijft die gebruikmaken van de Azure Storage SDK voor Python, die gebruikmaakt van de Azure Files REST API om te communiceren met Azure Files.

Van toepassing op

Bestands sharetype SMB NFS
Standaardbestandsshares (GPv2), LRS/ZRS Yes No
Standaardbestandsshares (GPv2), GRS/GZRS Yes No
Premium bestandsshares (FileStorage), LRS/ZRS Yes No

Azure Storage SDK voor Python downloaden en installeren

Notitie

Als u een upgrade uitvoert van de Azure Storage SDK voor Python versie 0.36 of eerder, verwijdert u de oudere SDK met behulp van pip uninstall azure-storage het nieuwste pakket voordat u het meest recente pakket installeert.

Voor de Azure Files-clientbibliotheek voor Python is Python 3.8+ vereist.

Installeren via PyPI

Als u wilt installeren via de Python Package Index (PyPI), typt u:

pip install azure-storage-file-share

Uw toepassing instellen voor het gebruik van Azure Files

Voeg de volgende code toe aan de bovenkant van een Python-broncodebestand om de codefragmenten in dit artikel te gebruiken.

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

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

Een verbinding met Azure Files instellen

Met ShareServiceClient kunt u werken met shares, mappen en bestanden. Met deze code maakt u een ShareServiceClient object met behulp van het opslagaccount verbindingsreeks:

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

Een Azure-bestandsshare maken

In het volgende codevoorbeeld wordt een ShareClient-object gebruikt om de share te maken als deze niet bestaat.

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)

Een map maken

U kunt opslag ordenen door bestanden in submappen te plaatsen in plaats van ze allemaal in de hoofdmap te plaatsen.

Met de volgende methode maakt u een map in de hoofdmap van de opgegeven bestandsshare met behulp van een ShareDirectoryClient-object .

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)

Een bestand uploaden

In deze sectie leert u hoe u een bestand uploadt vanuit lokale opslag naar Azure Files.

Met de volgende methode wordt de inhoud van het opgegeven bestand geüpload naar de opgegeven map in de opgegeven Azure-bestandsshare.

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)

Bestanden en mappen opsommen in een Azure-bestandsshare

Als u de bestanden en mappen in een submap wilt weergeven, gebruikt u de methode list_directories_and_files . Met deze methode wordt een automatische paging-itereerbaar geretourneerd. Met de volgende code wordt de naam van elk bestand en elke submap in de opgegeven map naar de console uitgevoerd.

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)

Een bestand downloaden

Als u gegevens uit een bestand wilt downloaden, gebruikt u download_file.

In het volgende voorbeeld ziet u hoe u download_file de inhoud van het opgegeven bestand opslaat en lokaal opslaat met DOWNLOADED, voorafgegaan door de bestandsnaam.

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)

Een momentopname van de share maken

U kunt een tijdskopie van uw hele bestandsshare maken.

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)

Shares en momentopnamen weergeven

U kunt alle momentopnamen voor een bepaalde share weergeven.

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)

Momentopname van share bladeren

U kunt door elke momentopname van een share bladeren om bestanden en mappen op te halen vanaf dat moment.

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)

Bestand ophalen uit momentopname van share

U kunt een bestand downloaden van een momentopname van een share, waarmee u een eerdere versie van een bestand kunt herstellen.

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)

Een momentopname van één share verwijderen

U kunt een momentopname van één share verwijderen.

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)

Een bestand verwijderen

Als u een bestand wilt verwijderen, roept u delete_file aan.

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)

Share verwijderen wanneer momentopnamen van shares bestaan

Als u een share wilt verwijderen die momentopnamen bevat, roept u delete_share aan met 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)

Volgende stappen

Nu u hebt geleerd hoe u Azure Files bewerkt met Python, volgt u deze koppelingen voor meer informatie.

Zie Codevoorbeelden met Python versie 2 voor gerelateerde codevoorbeelden met behulp van Python versie 2.