Разработка для файлов 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 | ||
Стандартные общие папки (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, воспользуйтесь следующими ссылками для получения дополнительных сведений.
- Центр по разработке для Python
- API-интерфейс REST служб хранилища Azure
- пакет SDK для службы хранилища Microsoft Azure для Python
Дополнительные примеры кода, использующие устаревшие пакеты SDK для Python версии 2, см. в примерах кода с помощью Python версии 2.