Develop for Azure Files with Python (Tworzenie oprogramowania dla usługi Azure Files przy użyciu języka Python)

Poznaj podstawy używania języka Python do tworzenia aplikacji lub usług, które używają usługi Azure Files do przechowywania danych plików. Utwórz aplikację konsolową i dowiedz się, jak wykonywać podstawowe akcje przy użyciu języka Python i usługi Azure Files:

  • Tworzenie udziałów plików platformy Azure
  • Tworzenie katalogów
  • Wyliczanie plików i katalogów w udziale plików platformy Azure
  • Przekazywanie, pobieranie i usuwanie pliku
  • Tworzenie kopii zapasowych udziału plików przy użyciu migawek

Uwaga

Ponieważ dostęp do usługi Azure Files można uzyskać za pośrednictwem protokołu SMB, można napisać proste aplikacje, które uzyskują dostęp do udziału plików platformy Azure przy użyciu standardowych klas i funkcji we/wy języka Python. W tym artykule opisano sposób pisania aplikacji korzystających z zestawu AZURE Storage SDK dla języka Python, które używają interfejsu API REST usługi Azure Files do komunikacji z usługą Azure Files.

Dotyczy

Typ udziału plików SMB NFS
Udziały plików w warstwie Standardowa (GPv2), LRS/ZRS Yes No
Udziały plików w warstwie Standardowa (GPv2), GRS/GZRS Yes No
Udziały plików w warstwie Premium (FileStorage), LRS/ZRS Yes No

Pobieranie i instalowanie zestawu SDK usługi Azure Storage dla języka Python

Uwaga

Jeśli uaktualniasz zestaw Azure Storage SDK dla języka Python w wersji 0.36 lub starszej, odinstaluj starszy zestaw SDK pip uninstall azure-storage przed zainstalowaniem najnowszego pakietu.

Biblioteka klienta usługi Azure Files dla języka Python wymaga języka Python w wersji 3.8 lub nowszej.

Instalowanie za pośrednictwem interfejsu PyPI

Aby zainstalować za pomocą indeksu pakietów języka Python (PyPI), wpisz:

pip install azure-storage-file-share

Konfigurowanie aplikacji do korzystania z usługi Azure Files

Dodaj następujący kod w górnej części pliku źródłowego języka Python, aby użyć fragmentów kodu w tym artykule.

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

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

Konfigurowanie połączenia z usługą Azure Files

Obiekt ShareServiceClient umożliwia pracę z udziałami, katalogami i plikami. Ten kod tworzy ShareServiceClient obiekt przy użyciu konta magazynu parametry połączenia:

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

Tworzenie udziału plików platformy Azure

Poniższy przykład kodu używa obiektu ShareClient do utworzenia udziału, jeśli nie istnieje.

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)

Tworzenie katalogu

Magazyn można organizować, umieszczając pliki wewnątrz podkatalogów zamiast umieszczać wszystkie z nich w katalogu głównym.

Poniższa metoda tworzy katalog w katalogu głównym określonego udziału plików przy użyciu obiektu 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)

Przekazywanie pliku

W tej sekcji dowiesz się, jak przekazać plik z magazynu lokalnego do usługi Azure Files.

Poniższa metoda przekazuje zawartość określonego pliku do określonego katalogu w określonym udziale plików platformy 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)

Wyliczanie plików i katalogów w udziale plików platformy Azure

Aby wyświetlić listę plików i katalogów w podkatalogu, użyj metody list_directories_and_files . Ta metoda zwraca iterowalne autostronicowanie. Poniższy kod zwraca nazwę każdego pliku i podkatalogu w określonym katalogu do konsoli programu .

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)

Pobieranie pliku

Aby pobrać dane z pliku, użyj download_file.

W poniższym przykładzie pokazano użycie metody download_file w celu pobrania zawartości określonego pliku i przechowania go lokalnie przy użyciu właściwości DOWNLOADED— prepended do nazwy pliku.

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)

Tworzenie migawki udziału

Możesz utworzyć kopię całego udziału plików w czasie.

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)

Wyświetlanie listy udziałów i migawek

Możesz wyświetlić listę wszystkich migawek dla określonego udziału.

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)

Przeglądanie migawki udziału

Możesz przeglądać każdą migawkę udziału, aby pobrać pliki i katalogi z tego punktu w czasie.

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)

Pobieranie pliku z migawki udziału

Plik można pobrać z migawki udziału, co umożliwia przywrócenie poprzedniej wersji pliku.

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)

Usuwanie migawki pojedynczego udziału

Można usunąć pojedynczą migawkę udziału.

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)

Usuwanie pliku

Aby usunąć plik, wywołaj 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)

Usuwanie udziału, gdy istnieją migawki udziału

Aby usunąć udział zawierający migawki, wywołaj delete_share za pomocą polecenia 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)

Następne kroki

Teraz, gdy wiesz już, jak manipulować usługą Azure Files przy użyciu języka Python, skorzystaj z tych linków, aby dowiedzieć się więcej.

Aby uzyskać powiązane przykłady kodu korzystające z przestarzałych zestawów SDK języka Python w wersji 2, zobacz Przykłady kodu przy użyciu języka Python w wersji 2.