Разработка для файлов Azure с помощью Python

Изучите основы использования Python для разработки приложений и служб, использующих файлы Azure для хранения файловых данных. Создайте консольное приложение и узнайте, как выполнять основные действия с Python и Файлы Azure:

  • создание файловых ресурсов Azure;
  • Создание каталогов
  • Перечисление файлов и каталогов в общей папке Azure
  • Передача, загрузка и удаление файлов.
  • Создание резервных копий общих папок с помощью моментальных снимков

Примечание.

Так как к файлам Azure можно обращаться по протоколу SMB, вы можете создавать простые приложения, которые получают доступ к файловым ресурсам Azure с использованием стандартных классов ввода-вывода и функций Python. Из этой статьи вы узнаете, как создавать приложения на основе пакета SDK службы хранилища Azure для Python. Этот пакет SDK использует REST API Файлов Azure для взаимодействия с Файлами Azure.

Применяется к

Тип общей папки SMB NFS
Стандартные общие папки (GPv2), LRS/ZRS Yes No
Стандартные общие папки (GPv2), GRS/GZRS Yes No
Общие папки уровня "Премиум" (FileStorage), LRS/ZRS Yes No

Скачивание и установка пакета SDK службы хранилища Azure для Python

Примечание.

Если вы обновляете пакет SDK службы хранилища Azure для Python версии 0.36 или более ранней, удалите старый пакет SDK с помощью pip uninstall azure-storage, прежде чем устанавливать последнюю версию пакета.

Для клиентской библиотеки Файлы Azure для Python требуется Python 3.8+.

Установка с помощью PyPI

Для установки с помощью индекса пакетов Python (PyPI) введите:

pip install azure-storage-file-share

Настройка приложения для работы со службой файлов Azure

Добавьте следующий код в верхней части исходного файла Python, чтобы использовать фрагменты кода в этой статье.

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

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

Настройка подключения к файлам Azure

Объект ShareServiceClient позволяет работать с общими папками, каталогами и файлами. Этот код создает объект с помощью учетной ShareServiceClient записи хранения строка подключения:

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

Создание общей папки Azure

В приведенном ниже примере кода для создания общего ресурса (если он не существует) используется объект ShareClient.

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)

Создание каталога

Вы можете упорядочить файлы в хранилище, разместив их в подкаталогах, чтобы не захламлять корневой каталог.

Следующий метод создает каталог в корне указанной общей папки с помощью объекта 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)

Отправка файла

В этом разделе описано, как отправить файл из локального хранилища в Файлы Azure.

Следующий метод передает содержимое указанного файла в указанный каталог в указанной общей папке 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)

Перечисление файлов и каталогов в общей папке Azure

Чтобы получить список файлов и каталогов в подкаталоге, используйте метод list_directories_and_files. Он возвращает итерируемое автоматическое разбиение на страницы. Приведенный далее код выводит в консоль имя каждого файла и подкаталога в указанном каталоге.

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)

Скачивание файла

Чтобы загрузить данные из файла, используйте метод download_file.

В следующем примере показано, как использовать метод download_file для получения содержимого указанного файла и его локального сохранения с добавлением DOWNLOADED- перед именем файла.

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)

Создание моментального снимка общего ресурса

Вы можете создать копию на момент времени всего общего файлового ресурса.

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)

Список общих ресурсов и моментальных снимков

Вы можете вывести список всех моментальных снимков для определенного общего ресурса.

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)

Просмотр снимков общего ресурса

Вы можете просмотреть каждый моментальный снимок общих папок, чтобы извлечь файлы и каталоги с этого момента времени.

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)

Получение файлов из моментальных снимков общих ресурсов

Вы можете скачать файл из моментального снимка общего ресурса, что позволяет восстановить предыдущую версию файла.

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)

Удаление одного моментального снимка общих ресурсов

Вы можете удалить один моментальный снимок общих ресурсов.

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)

Удаление файла

Чтобы удалить файл, вызовите метод 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)

Удаление общего ресурса с имеющимся моментальным снимком общих ресурсов

Чтобы удалить общую папку с моментальными снимками, вызовите метод delete_share с помощью 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)

Следующие шаги

Теперь, когда вы узнали, как работать с файлами Azure с помощью Python, воспользуйтесь следующими ссылками для получения дополнительных сведений.

Дополнительные примеры кода, использующие устаревшие пакеты SDK для Python версии 2, см. в примерах кода с помощью Python версии 2.