Поделиться через


Разработка приложений Python, использующих Файлы Azure

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

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

Примечание.

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

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

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

Скачивание и установка пакета 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.