Vývoj aplikací Pythonu, které používají Azure Files

Seznamte se se základy používání Pythonu k vývoji aplikací nebo služeb, které používají Azure Files k ukládání dat souborů. Vytvořte konzolovou aplikaci a naučte se provádět základní akce pomocí Pythonu a Azure Files:

  • Vytvoření sdílených složek Azure
  • Odstraňování adresářů
  • Vytvoření výčtu souborů a adresářů ve sdílené složce Azure
  • Nahrání, stažení a odstranění souboru
  • Vytváření záloh sdílených složek pomocí snímků

Poznámka:

Vzhledem k tomu, že služba Soubory Azure je možná přístupná přes protokol SMB, je možné psát jednoduché aplikace, které přistupují ke sdílené složce Azure pomocí standardních vstupně-výstupních tříd a funkcí Pythonu. Tento článek popisuje, jak psát aplikace, které používají sadu Azure Storage SDK pro Python, která používá rozhraní REST API služby Azure Files ke komunikaci se službou Azure Files.

Platí pro

Typ sdílené složky SMB NFS
Sdílené složky úrovně Standard (GPv2), LRS/ZRS Yes No
Sdílené složky úrovně Standard (GPv2), GRS/GZRS Yes No
Sdílené složky úrovně Premium (FileStorage), LRS/ZRS Yes No

Stažení a instalace sady Azure Storage SDK pro Python

Poznámka:

Pokud upgradujete ze sady Azure Storage SDK pro Python verze 0.36 nebo starší, odinstalujte starší sadu SDK před pip uninstall azure-storage instalací nejnovějšího balíčku.

Klientská knihovna Azure Files pro Python vyžaduje Python 3.8 nebo novější.

Instalace přes PyPI

Pokud chcete provést instalaci prostřednictvím indexu balíčků Pythonu (PyPI), zadejte:

pip install azure-storage-file-share

Nastavení aplikace pro použití služby Azure Files

Do horní části zdrojového souboru Pythonu přidejte následující kód pro použití fragmentů kódu v tomto článku.

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

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

Nastavení připojení ke službě Azure Files

ShareServiceClient umožňuje pracovat se sdílenými složkami, adresáři a soubory. Tento kód vytvoří ShareServiceClient objekt pomocí účtu úložiště připojovací řetězec:

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

Vytvoření sdílené složky Azure

Následující příklad kódu používá objekt ShareClient k vytvoření sdílené složky, pokud neexistuje.

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)

Vytvoření adresáře

Úložiště můžete uspořádat tak, že soubory umístíte do podadresářů, a nemusíte je mít všechny v kořenovém adresáři.

Následující metoda vytvoří adresář v kořenovém adresáři zadané sdílené složky pomocí objektu 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)

Odeslání souboru

V této části se dozvíte, jak nahrát soubor z místního úložiště do služby Azure Files.

Následující metoda nahraje obsah zadaného souboru do zadaného adresáře v zadané sdílené složce Azure.

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)

Vytvoření výčtu souborů a adresářů ve sdílené složce Azure

K výpisu souborů a adresářů v podadresáři použijte metodu list_directories_and_files . Tato metoda vrátí iterovatelné automatické stránkování. Následující kód vypíše název každého souboru a podadresáře v zadaném adresáři do konzoly.

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)

Stažení souboru

Pokud chcete stáhnout data ze souboru, použijte download_file.

Následující příklad ukazuje použití download_file k získání obsahu zadaného souboru a jeho místní uložení s předponou DOWNLOADED - předem na název souboru.

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)

Vytvoření snímku sdílené složky

Můžete vytvořit kopii celé sdílené složky k určitému bodu v čase.

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)

Výpis sdílených složek a snímků

Můžete zobrazit seznam všech snímků pro určitou sdílenou složku.

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)

Procházení snímku sdílené složky

Každý snímek sdílené složky můžete procházet a načítat soubory a adresáře z tohoto bodu v čase.

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)

Získání souboru ze snímku sdílené složky

Soubor si můžete stáhnout ze snímku sdílené složky, který umožňuje obnovit předchozí verzi souboru.

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)

Odstranění jednoho snímku sdílené složky

Můžete odstranit jeden snímek sdílené složky.

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)

Odstranění souboru

Pokud chcete odstranit soubor, zavolejte 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)

Odstranění sdílené složky, když existují snímky sdílené složky

Pokud chcete odstranit sdílenou složku, která obsahuje snímky, zavolejte delete_share s 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)

Další kroky

Teď, když jste se naučili pracovat se soubory Azure pomocí Pythonu, najdete další informace pomocí těchto odkazů.

Související ukázky kódu s využitím zastaralých sad SDK pro Python verze 2 najdete v ukázkách kódu s využitím Pythonu verze 2.