Desarrollo para Azure Files con Python

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 a través de 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 Python de Azure Storage, 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 Yes No
Recursos compartidos de archivos Estándar (GPv2), GRS/GZRS Yes No
Recursos compartidos de archivos Premium (FileStorage), LRS/ZRS Yes No

Descarga e instalación del SDK de Azure Storage para Python

Nota:

Si va a actualizar desde el SDK de Azure Storage para Python 0.36 o una versión anterior, 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.

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.