Desarrollo de aplicaciones de Python que usan Azure Files
Conozca los aspectos básicos del uso de Python para desarrollar aplicaciones o servicios que usan Azure Files para almacenar datos de archivos. Cree una aplicación de consola y aprenda a realizar acciones básicas con Python y Azure Files:
- Crear recursos compartidos de archivos de Azure
- Crear directorios
- Enumerar los archivos y directorios de un recurso compartido de Azure File
- Cargar, descargar y eliminar un archivo
- Crear copias de seguridad de recursos compartidos de archivos mediante instantáneas
Nota:
Dado que se puede acceder a Azure Files mediante SMB, es posible escribir aplicaciones simples que accedan al recurso compartido de archivos de Azure mediante las clases y funciones estándar de E/S de Python. En este artículo, se describe cómo escribir aplicaciones que usen el SDK de Azure Storage para Python, que emplea la API REST de Azure Files para comunicarse con Azure Files.
Se aplica a
Tipo de recurso compartido de archivos | SMB | NFS |
---|---|---|
Recursos compartidos de archivos Estándar (GPv2), LRS/ZRS | ||
Recursos compartidos de archivos Estándar (GPv2), GRS/GZRS | ||
Recursos compartidos de archivos Premium (FileStorage), LRS/ZRS |
Descarga e instalación del SDK de Azure Storage para Python
Nota:
Si va a actualizar desde la versión 0.36 o anterior del SDK de Azure Storage para Python, desinstale el SDK anterior mediante pip uninstall azure-storage
antes de instalar el paquete más reciente.
La biblioteca cliente de Azure Files para Python requiere Python 3.8 u otra versión posterior.
Instalación mediante PyPI
Para realizar la instalación mediante el índice de paquetes de Python (PyPI), escriba:
pip install azure-storage-file-share
Configuración de la aplicación para usar Azure Files
Agregue el siguiente código cerca de la parte superior de un archivo de origen Python para utilizar los fragmentos de código de este artículo.
from azure.core.exceptions import (
ResourceExistsError,
ResourceNotFoundError
)
from azure.storage.fileshare import (
ShareServiceClient,
ShareClient,
ShareDirectoryClient,
ShareFileClient
)
Configuración de una conexión a Azure Files
ShareServiceClient le permite trabajar con recursos compartidos, directorios y archivos. Este código crea un objeto ShareServiceClient
con la cadena de conexión de la cuenta de almacenamiento:
# Create a ShareServiceClient from a connection string
service_client = ShareServiceClient.from_connection_string(connection_string)
Creación de un recurso compartido de archivos de Azure
En el siguiente código de ejemplo, puede usar un objeto ShareClient para crear el recurso compartido, en caso de que no exista.
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)
Creación de un directorio
Para organizar el almacenamiento, coloque los archivos en los subdirectorios, en lugar de mantenerlos todos en el directorio raíz.
El método siguiente crea un directorio en la raíz del recurso compartido de archivos especificado utilizando un objeto 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)
Cargar un archivo
En esta sección, aprenderá a cargar un archivo desde el almacenamiento local en Azure Files.
El método siguiente carga el contenido del archivo especificado en el directorio que está especificado en el recurso compartido de archivos de Azure especificado.
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)
Enumerar los archivos y directorios de un recurso compartido de Azure File
Para enumerar los archivos y directorios de un subdirectorio, use el método list_directories_and_files. Este método devuelve un objeto iterable de paginación automática. El código siguiente genera el nombre de cada archivo y subdirectorio del directorio especificado en la consola.
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)
Descarga de un archivo
Para descargar los datos de un archivo, use download_file.
En el ejemplo siguiente se muestra cómo usar download_file
para obtener el contenido del archivo especificado y almacenarlo localmente con el valor DOWNLOADED- antepuesto al nombre de archivo.
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)
Creación de una instantánea de recurso compartido
Puede crear una copia a un punto dado de todo el recurso compartido de archivos.
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)
Enumeración de recursos compartidos e instantáneas
Puede enumerar todas las instantáneas para un recurso compartido determinado.
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)
Examinación de instantáneas de recurso compartido
Puede examinar cada instantánea de recurso compartido para recuperar archivos y directorios desde ese punto dado.
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)
Obtención del archivo desde una instantánea de recurso compartido
Puede descargar un archivo de una instantánea de recurso compartido, lo que le permite restaurar una versión anterior de un archivo.
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)
Eliminación de una instantánea de recurso compartido única
Puede eliminar una instantánea de recurso compartido única.
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)
Eliminación de un archivo
Para eliminar un archivo, llame a 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)
Eliminación de un recurso compartido cuando existen instantáneas de recurso compartido
Para eliminar un recurso compartido que contenga instantáneas, llame a delete_share con 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)
Pasos siguientes
Ahora que ha aprendido a manipular Azure Files con Python, siga estos vínculos para obtener más información.
- Centro para desarrolladores de Python
- API de REST de servicios de Azure Storage
- SDK de Microsoft Azure Storage para Python
Para ver ejemplos de código relacionados que usan los SDK de la versión 2 en desuso de Python, consulte Ejemplos de código que usan la versión 2 de Python.