Compartir a través de


Desarrollo para Azure Files con Python

Aprenda a desarrollar aplicaciones de Python que usan Azure Files para almacenar datos. Azure Files es un servicio de recurso compartido de archivos administrado en la nube. Proporciona recursos compartidos de archivos totalmente administrados a los que se puede acceder a través de los protocolos estándar del bloque de mensajes del servidor (SMB) y del sistema de archivos de red (NFS). Azure Files también proporciona una API REST para el acceso mediante programación a los recursos compartidos de archivos.

En este artículo, obtendrá información sobre los distintos enfoques para desarrollar con Azure Files en Python y cómo elegir el enfoque que mejor se adapte a las necesidades de la aplicación. También aprenderá a crear una aplicación de consola básica que interactúe con los recursos de Azure Files.

Se aplica a

Modelo de administración Modelo de facturación Nivel multimedia Redundancia SMB NFS
Microsoft.Storage Aprovisionado v2 HDD (estándar) Local (LRS) Yes No
Microsoft.Storage Aprovisionado v2 HDD (estándar) Zona (ZRS) Yes No
Microsoft.Storage Aprovisionado v2 HDD (estándar) Geo (GRS) Yes No
Microsoft.Storage Aprovisionado v2 HDD (estándar) GeoZone (GZRS) Yes No
Microsoft.Storage Aprovisionado v1 SSD (Premium) Local (LRS) Yes No
Microsoft.Storage Aprovisionado v1 SSD (Premium) Zona (ZRS) Yes No
Microsoft.Storage Pago por uso HDD (estándar) Local (LRS) Yes No
Microsoft.Storage Pago por uso HDD (estándar) Zona (ZRS) Yes No
Microsoft.Storage Pago por uso HDD (estándar) Geo (GRS) Yes No
Microsoft.Storage Pago por uso HDD (estándar) GeoZone (GZRS) Yes No

Acerca del desarrollo de aplicaciones de Python con Azure Files

Azure Files ofrece varias maneras para que los desarrolladores de Python accedan a datos y administren recursos en Azure Files. En la tabla siguiente se enumeran los enfoques, se resume cómo funcionan y se proporcionan instrucciones sobre cuándo usar cada enfoque:

Enfoque Cómo funciona Cuándo usar
Bibliotecas de E/S de archivos estándar Usa llamadas API de nivel de sistema operativo a través de recursos compartidos de archivos de Azure montados mediante SMB o NFS. Al montar un recurso compartido de archivos mediante SMB/NFS, puede usar bibliotecas de E/S de archivos para un lenguaje o marco de programación, como os y io para Python. Tiene aplicaciones de línea de negocio con código existente que usa E/S de archivos estándar y no quiere volver a escribir código para que la aplicación funcione con un recurso compartido de archivos de Azure.
FileREST API Llama directamente a los puntos de conexión HTTPS para interactuar con los datos almacenados en Azure Files. Proporciona control mediante programación sobre los recursos compartidos de archivos. El SDK de Azure proporciona la biblioteca cliente de recursos compartidos de archivos (azure-storage-file-share) que se basa en la API FileREST, lo que le permite interactuar con las operaciones de la API fileREST a través de paradigmas conocidos del lenguaje de programación python. Va a crear servicios y aplicaciones en la nube agregados de valor para los clientes y quiere usar características avanzadas que no están disponibles a través de bibliotecas de E/S de archivos de Python.
API REST del proveedor de recursos de almacenamiento Usa Azure Resource Manager (ARM) para administrar cuentas de almacenamiento y recursos compartidos de archivos. Llama a los puntos de conexión de la API REST para varias operaciones de administración de recursos. La aplicación o el servicio deben realizar tareas de administración de recursos, como crear, eliminar o actualizar cuentas de almacenamiento o recursos compartidos de archivos.

Para obtener información general sobre estos enfoques, consulte Introducción al desarrollo de aplicaciones con Azure Files.

Este artículo se centra en trabajar con recursos de Azure Files mediante los siguientes enfoques:

Prerrequisitos

Configurar su proyecto

En esta sección se explica cómo preparar un proyecto para trabajar con Azure Files.

Desde el directorio del proyecto, instale paquetes en función de las necesidades de la aplicación mediante el pip install comando . En el ejemplo siguiente se muestra cómo instalar la biblioteca cliente de recursos compartidos de archivos de Azure, la biblioteca cliente de administración de storage y la biblioteca de identidades de Azure. El paquete azure-identity es necesario para las conexiones sin contraseña a los servicios de Azure.

pip install azure-identity
pip install azure-storage-file-share
pip install azure-mgmt-resource
pip install azure-mgmt-storage

Abra el archivo de código y agregue las instrucciones de importación necesarias.

Si tiene previsto usar python os y io bibliotecas, agregue lo siguiente al archivo .py :

import os
import io

Si tiene previsto usar la biblioteca cliente de recursos compartidos de archivos de Azure Storage, agregue lo siguiente al archivo de .py :

from azure.identity import DefaultAzureCredential
from azure.storage.fileshare import ShareClient, ShareDirectoryClient, ShareFileClient

Si planea usar las bibliotecas de administración de Azure Storage, agregue lo siguiente al archivo .py :

from azure.identity import DefaultAzureCredential
from azure.mgmt.resource import ResourceManagementClient
from azure.mgmt.storage import StorageManagementClient

Trabajar con Azure Files usando bibliotecas de E/S de archivos de Python

Las bibliotecas de E/S de archivos estándar son la forma más común de acceder a los recursos de Azure Files y trabajar con ellos. Al montar un recurso compartido de archivos mediante SMB o NFS, el sistema operativo redirige las solicitudes de API para el sistema de archivos local. Este enfoque permite usar bibliotecas de E/S de archivos estándar, como os o io, para interactuar con archivos y directorios en el recurso compartido.

Considere la posibilidad de usar bibliotecas de E/S de archivos de Python cuando la aplicación requiera:

  • Compatibilidad de aplicaciones: Ideal para aplicaciones de línea de negocio con código existente que ya usa bibliotecas de E/S de archivos de Python. No es necesario volver a escribir código para que la aplicación funcione con un recurso compartido de archivos de Azure.
  • Facilidad de uso: Los desarrolladores conocen las bibliotecas de E/S de archivos de Python y son fáciles de usar. Una propuesta de valor clave de Azure Files es que expone las API nativas del sistema de archivos a través de SMB y NFS.

En esta sección, aprenderá a usar bibliotecas de E/S de archivos de Python para trabajar con recursos de Azure Files.

Para obtener más información y ejemplos, consulte los siguientes recursos:

  • Bibliotecas de Python para E/S de archivos: os e io

Montar un recurso compartido de archivos

Para usar bibliotecas de E/S de archivos de Python, primero debe montar una compartición de archivos. Consulte los siguientes recursos para obtener instrucciones sobre cómo montar un recurso compartido de archivos mediante SMB o NFS:

En este artículo, usamos la siguiente ruta de acceso para hacer referencia a un recurso compartido de archivos SMB montado en Windows:

file_share_path = "Z:\\file-share"

Ejemplo: Conexión a un recurso compartido de archivos y enumeración de directorios mediante bibliotecas de E/S de archivos de Python

En el ejemplo de código siguiente se muestra cómo conectarse a un recurso compartido de archivos y enumerar los directorios del recurso compartido:

import os

def enumerate_directories(path):
    try:
        # Get all directories in the specified path
        dirs = [d for d in os.listdir(path) if os.path.isdir(os.path.join(path, d))]
        
        # Print each directory name
        for dir_name in dirs:
            print(f"{dir_name}")
            
        print(f"{len(dirs)} directories found.")
    except (PermissionError, FileNotFoundError, OSError) as ex:
        print(f"Error: {ex}")

#Example usage
file_share_path = "Z:\\file-share"
enumerate_directories(file_share_path)

Ejemplo: Escritura en un archivo en un recurso compartido de archivos mediante bibliotecas de E/S de archivos de Python

En el ejemplo de código siguiente se muestra cómo escribir y anexar texto a un archivo:

import os

def write_to_file(file_share_path, file_name):
    # First line of text with platform-appropriate line ending
    text_to_write = "First line" + os.linesep
    
    # Combine the file share path and filename
    file_path = os.path.join(file_share_path, file_name)
    
    # Write initial text to file (overwrites if file exists)
    with open(file_path, 'w') as file:
        file.write(text_to_write)
    
    # Text to append
    text_to_append = ["Second line", "Third line"]
    
    # Append lines to the file
    with open(file_path, 'a') as file:
        file.write(os.linesep.join(text_to_append) + os.linesep)

# Example usage
file_share_path = "Z:\\file-share"
write_to_file(file_share_path, "test.txt")

Ejemplo: Enumerar ACL de archivos mediante bibliotecas de E/S de archivos de Python

En el ejemplo de código siguiente se muestra cómo enumerar listas de control de acceso (ACL) básicas para un archivo:

import os
import stat

def enumerate_file_acls(file_path):
    try:
        # Get file stats
        file_stat = os.stat(file_path)
        
        # Get permissions in octal format
        permissions_octal = oct(stat.S_IMODE(file_stat.st_mode))
        
        print(f"File: {file_path}")
        print(f"Permissions (octal): {permissions_octal}")
        
        # Interpret permissions in a human-readable format
        permissions = ""
        permissions += "r" if file_stat.st_mode & stat.S_IRUSR else "-"
        permissions += "w" if file_stat.st_mode & stat.S_IWUSR else "-"
        permissions += "x" if file_stat.st_mode & stat.S_IXUSR else "-"
        permissions += "r" if file_stat.st_mode & stat.S_IRGRP else "-"
        permissions += "w" if file_stat.st_mode & stat.S_IWGRP else "-" 
        permissions += "x" if file_stat.st_mode & stat.S_IXGRP else "-"
        permissions += "r" if file_stat.st_mode & stat.S_IROTH else "-"
        permissions += "w" if file_stat.st_mode & stat.S_IWOTH else "-"
        permissions += "x" if file_stat.st_mode & stat.S_IXOTH else "-"
        
        print(f"Permissions (symbolic): {permissions}")
        
        print(f"Owner ID: {file_stat.st_uid}")
        print(f"Group ID: {file_stat.st_gid}")
        print("Note: For detailed Windows ACLs, you may need a specialized library.")
        
    except FileNotFoundError:
        print(f"Error: File '{file_path}' not found.")
    except PermissionError:
        print(f"Error: Permission denied for '{file_path}'.")
    except Exception as e:
        print(f"Error: {e}")

# Example usage
file_share_path = "Z:\\file-share"
file_name = "test.txt"
file_path = os.path.join(file_share_path, file_name)

enumerate_file_acls(file_path)

Trabajar con datos de Azure Files utilizando la biblioteca cliente de Azure File Shares para Python

La API FileREST proporciona acceso mediante programación a Azure Files. Permite llamar a puntos de conexión HTTPS para realizar operaciones en comparticiones de archivos, directorios y archivos. La API FileREST está diseñada para alta escalabilidad y características avanzadas que podrían no estar disponibles a través de protocolos nativos. El SDK de Azure proporciona bibliotecas cliente, como la biblioteca cliente de recursos compartidos de archivos para Python, que se basa en la API FileREST.

Considere la posibilidad de usar la API FileREST y la biblioteca cliente del recurso compartido de archivos si la aplicación requiere:

  • Características avanzadas: Acceso a las operaciones y características que no están disponibles a través de protocolos nativos.
  • Integraciones en la nube personalizadas: Cree servicios personalizados de valor agregado, como copia de seguridad, antivirus o administración de datos, que interactúan directamente con Azure Files.
  • Optimización del rendimiento: Beneficiarse de las ventajas de rendimiento en escenarios a gran escala mediante operaciones de plano de datos.

La API FileREST modela Azure Files como una jerarquía de recursos y se recomienda para las operaciones que se realizan en el nivel de directorio o archivo . Debe preferir la API REST del proveedor de recursos de almacenamiento para las operaciones que se realizan en el nivel de servicio de archivos o recurso compartido de archivos .

En esta sección, aprenderá a usar la biblioteca cliente de recursos compartidos de archivos para trabajar con recursos de Azure Files.

Para obtener más información y ejemplos, consulte los siguientes recursos:

Autorización del acceso y creación de un cliente

Para conectar una aplicación a Azure Files, cree un ShareClient objeto . Este objeto es el punto de partida para trabajar con recursos de Azure Files. En los ejemplos de código siguientes se muestra cómo crear un ShareClient objeto mediante distintos mecanismos de autorización.

Para autorizar con Microsoft Entra ID, debe usar una entidad de seguridad. El tipo de entidad de seguridad que necesita depende de dónde se ejecute la aplicación. Use esta tabla como guía.

Dónde se ejecuta la aplicación Principal de seguridad Orientación
Máquina local (desarrollo y pruebas) Entidad de servicio Para obtener información sobre cómo registrar la aplicación, configurar un grupo de Microsoft Entra, asignar roles y configurar variables de entorno, consulte Autorización del acceso mediante entidades de servicio para desarrolladores.
Máquina local (desarrollo y pruebas) Identidad del usuario Para obtener información sobre cómo configurar un grupo de Microsoft Entra, asignar roles e iniciar sesión en Azure, consulte Autorización del acceso mediante credenciales de desarrollador.
Hospedado en Azure Identidad administrada Para obtener información sobre cómo habilitar la identidad administrada y asignar roles, consulte Autorización del acceso desde aplicaciones hospedadas en Azure mediante una identidad administrada.
Hospedado fuera de Azure (por ejemplo, aplicaciones locales) Entidad de servicio Para obtener información sobre cómo registrar la aplicación, asignar roles y configurar variables de entorno, consulte Autorización del acceso desde aplicaciones locales mediante una entidad de servicio de aplicación.

Para trabajar con los ejemplos de código de este artículo, asigne el rol integrado RBAC de Azure Storage File Data Privileged Contributor a la entidad de seguridad. Este rol proporciona acceso completo de lectura, escritura, modificación de ACL y eliminación en todos los datos de los recursos compartidos para todas las cuentas de almacenamiento configuradas, independientemente de los permisos NTFS de nivel de archivo o directorio establecidos. Para obtener más información, consulte Acceso a recursos compartidos de archivos de Azure mediante el identificador de Microsoft Entra con Azure Files OAuth sobre REST.

Autorización del acceso mediante DefaultAzureCredential

Una manera sencilla y segura de autorizar el acceso y conectarse a Azure Files es obtener un token de OAuth mediante la creación de una instancia defaultAzureCredential . A continuación, puede usar esa credencial para crear un ShareClient objeto.

En el ejemplo siguiente se crea un ShareClient objeto autorizado mediante DefaultAzureCredentialy, a continuación, se crea un ShareDirectoryClient objeto para trabajar con un directorio en el recurso compartido:

from azure.identity import DefaultAzureCredential
from azure.storage.fileshare import ShareClient

account_name = "<account-name>"
share_name = "<share-name>"

# Create the share client using DefaultAzureCredential
share_client = ShareClient(
    account_url=f"https://{account_name}.file.core.windows.net",
    share_name=share_name,
    credential=DefaultAzureCredential(),
    # When using a token credential, you MUST specify a token_intent
    token_intent='backup'
)

# Get a reference to a directory in the share
directory_client = share_client.get_directory_client("sample-directory")

Si sabe exactamente qué tipo de credencial usa para autenticar a los usuarios, puede obtener un token de OAuth mediante otras clases de la biblioteca cliente de Identidad de Azure para Python. Estas clases derivan de la clase TokenCredential .

Para obtener más información sobre cada uno de estos mecanismos de autorización, consulte Elección de cómo autorizar el acceso a los datos de archivos.

Ejemplo: Copia de archivos mediante la biblioteca cliente de File Shares

Puede copiar archivos dentro de un recurso compartido de archivos o entre recursos compartidos de archivos mediante el método siguiente:

Puede copiar un archivo en un blob de destino mediante el método siguiente desde un BlobClient objeto :

En el ejemplo de código siguiente se muestra cómo copiar un archivo en un archivo de otro recurso compartido de archivos:

from azure.identity import DefaultAzureCredential
from azure.storage.fileshare import ShareFileClient

# Define storage account parameters
account_name = "<account-name>"
src_share_name = "src-file-share"
dest_share_name = "dest-file-share"
src_file_path = "src/path/to/file"
dest_file_path = "dest/path/to/file"

# Create token credential
token_credential = DefaultAzureCredential()

# Create source file client
src_file_client = ShareFileClient(
    account_url=f"https://{account_name}.file.core.windows.net",
    share_name=src_share_name,
    file_path=src_file_path,
    credential=token_credential,
    token_intent='backup'
)

# Create destination file client
dest_file_client = ShareFileClient(
    account_url=f"https://{account_name}.file.core.windows.net",
    share_name=dest_share_name,
    file_path=dest_file_path,
    credential=token_credential,
    token_intent='backup'
)

# Copy the file from the source share to the destination share
copy_operation = dest_file_client.start_copy_from_url(src_file_client.url)

Ejemplo: concesión de un archivo mediante la biblioteca cliente de recursos compartidos de archivos

Una concesión crea un bloqueo en un archivo administrado por Azure mediante un identificador de concesión. La concesión proporciona un mecanismo para coordinar el acceso a los archivos en varios clientes de un sistema distribuido. Una concesión en un archivo proporciona acceso exclusivo de escritura y eliminación. Para más información sobre los estados de concesión y las acciones, consulte Archivo de concesión.

En el ejemplo de código siguiente se muestra cómo crear un cliente de concesión, adquirir una concesión de duración infinita en un archivo y liberar la concesión:

from azure.identity import DefaultAzureCredential
from azure.storage.fileshare import ShareFileClient, ShareLeaseClient

# Define storage account parameters
account_name = "<account-name>"
share_name = "sample-file-share"
file_path = "path/to/file"

# Create a DefaultAzureCredential for authentication
token_credential = DefaultAzureCredential()

# Create a ShareFileClient
file_client = ShareFileClient(
    account_url=f"https://{account_name}.file.core.windows.net",
    share_name=share_name,
    file_path=file_path,
    credential=token_credential,
    token_intent='backup'
)

# Get a lease client for the file
lease_client = ShareLeaseClient(file_client)

# Acquire an infinite duration lease on the file
lease_info = lease_client.acquire()

# Do something with the file while it's leased
# ...

# Release the lease
lease_client.release()

Al usar SMB y la API FileREST, tenga en cuenta que la API FileREST usa concesiones para administrar bloqueos de archivos, mientras que SMB usa bloqueos del sistema de archivos administrados por el sistema operativo. Para obtener más información sobre cómo administrar las interacciones de bloqueo de archivos entre SMB y la API FileREST, consulte Administración de bloqueos de archivos.

Ejemplo: Crear y enumerar instantáneas de recurso compartido mediante la biblioteca cliente de recursos compartidos de archivos

Las instantáneas de recurso compartido son copias de solo lectura de un recurso compartido de archivos en un momento dado. Puede crear una instantánea de un recurso compartido de archivos y, a continuación, usar la instantánea para acceder a los datos del recurso compartido en el momento en que se creó la instantánea. También puede enumerar todas las instantáneas de un recurso compartido de archivos y eliminar instantáneas de recurso compartido.

En el ejemplo de código siguiente se muestra cómo crear una instantánea de recurso compartido, enumerar las instantáneas de un recurso compartido de archivos y recorrer el directorio raíz en una instantánea de recurso compartido:

from azure.storage.fileshare import ShareServiceClient, ShareDirectoryClient

def list_root_directory_snapshot(root_dir: ShareDirectoryClient):
    for item in root_dir.list_directories_and_files():
        if item["is_directory"]:
            print(f"Directory in snapshot: {item['name']}")
        else:
            print(f"File in snapshot: {item['name']}")

# Connection string with account key (required for share snapshots)
connection_string = "<connection-string>"

# Create service and share clients
share_service_client = ShareServiceClient.from_connection_string(connection_string)
share_name = "sample-file-share"
share_client = share_service_client.get_share_client(share_name)

# Create a snapshot
snapshot_info = share_client.create_snapshot()
print(f"Snapshot created: {snapshot_info['snapshot']}")

# List snapshots in a share
for share_item in share_service_client.list_shares(include_snapshots=True):
    if share_item["snapshot"]:
        print(f"Share: {share_item['name']} (Snapshot: {share_item['snapshot']})")

# List directories and files in a share snapshot
snapshot_timestamp = snapshot_info["snapshot"]
share_snapshot = share_service_client.get_share_client(share_name, snapshot=snapshot_timestamp)
root_dir = share_snapshot.get_directory_client("")

list_root_directory_snapshot(root_dir)

Nota:

Los tokens de OAuth, como los obtenidos al usar DefaultAzureCredential, no se permiten para las operaciones del plano de datos en el nivel de compartición de archivos. Para trabajar con instantáneas de recurso compartido, el objeto de cliente debe estar autorizado mediante la clave de cuenta. El ShareClient objeto creado en este ejemplo de código usa una cadena de conexión, que incluye la clave de cuenta.

El almacenamiento de claves de cuenta o cadenas de conexión presenta un riesgo de seguridad. Solo debe usarlos cuando la autenticación de Microsoft Entra no esté disponible. Para más información sobre cómo almacenar de forma segura las claves de cuenta en Azure Key Vault, consulte Acerca de las claves de cuenta de almacenamiento administradas de Azure Key Vault.

Administración de recursos de Azure Files mediante las bibliotecas de administración de Azure Storage

Las bibliotecas de administración de Azure Storage se basan en la API REST del proveedor de recursos de Azure Storage. El proveedor de recursos de Azure Storage es un servicio basado en Azure Resource Manager y admite métodos declarativos (plantillas) e imperativos (llamada a API directa). La API REST del proveedor de recursos de Azure Storage proporciona acceso mediante programación a los recursos de Azure Storage, incluidos los recursos compartidos de archivos. El SDK de Azure proporciona bibliotecas de administración que se basan en la API REST del proveedor de recursos de Azure Storage.

Las bibliotecas de administración se recomiendan para las operaciones que se realizan en el servicio de archivos o en el nivel de recurso compartido de archivos . En esta sección, aprenderá a usar las bibliotecas de administración de Azure Storage para administrar recursos de Azure Files.

Ejemplo: Creación de un recurso compartido de archivos mediante la biblioteca de administración de Azure Storage

En el ejemplo de código siguiente se muestra cómo crear un objeto de nivel ArmClient superior, registrar el proveedor de recursos storage con una suscripción y crear un recurso compartido de archivos mediante la biblioteca de administración de Azure Storage:

from azure.identity import DefaultAzureCredential
from azure.mgmt.resource import ResourceManagementClient, SubscriptionClient
from azure.mgmt.storage import StorageManagementClient
from azure.mgmt.storage.models import FileShare

# Create the credential for authentication
credential = DefaultAzureCredential()

# Define variables
subscription_id = "<subscription-id>"
resource_group_name = "<resource-group-name>"
storage_account_name = "<storage-account-name>"
share_name = "sample-file-share"

# Create clients
resource_client = ResourceManagementClient(credential, subscription_id)
subscription_client = SubscriptionClient(credential)
storage_client = StorageManagementClient(credential, subscription_id)

# Register Microsoft.Storage resource provider, if not already registered
provider = resource_client.providers.get('Microsoft.Storage')
if provider.registration_state == "NotRegistered":
    resource_client.providers.register('Microsoft.Storage')

# Create a file share
file_share = storage_client.file_shares.create(
    resource_group_name=resource_group_name,
    account_name=storage_account_name,
    share_name=share_name,
    file_share=FileShare(
        share_quota=1  # Share size in GiB
        # Add other file share properties here
    )
)

Puede configurar las propiedades del recurso compartido de archivos mediante la clase . En el ejemplo anterior se muestra cómo establecer la share_quota propiedad . Para más información, consulte la referencia de la clase StorageManagementClient .

Nota:

Para realizar la operación de registro, necesita permisos para la siguiente acción de RBAC de Azure: Microsoft.Storage/register/action. Este permiso se incluye en los roles integrados Colaborador y Propietario.

Ejemplo: Listar recursos compartidos de archivos e instantáneas mediante la biblioteca de administración de Azure Storage

En el ejemplo de código siguiente se muestra cómo enumerar los recursos compartidos de archivos y las instantáneas en una cuenta de almacenamiento:

from azure.identity import DefaultAzureCredential
from azure.mgmt.storage import StorageManagementClient

# Create the credential for authentication
credential = DefaultAzureCredential()

# Define variables
subscription_id = "<subscription-id>"
resource_group_name = "<resource-group-name>"
storage_account_name = "<storage-account-name>"
expand = "snapshots"  # Include snapshots in the response

# Create storage management client
storage_client = StorageManagementClient(credential, subscription_id)

# List all file shares with their snapshots
file_shares = storage_client.file_shares.list(
    resource_group_name=resource_group_name,
    account_name=storage_account_name,
    expand=expand
)

# Iterate over the file shares and print them along with any snapshots
for share in file_shares:
    print(f"Resource name: {share.name}")
    if share.snapshot_time:
        print(f"Snapshot: {share.snapshot_time}")

Para más información sobre el desarrollo con Azure Files, consulte los siguientes recursos: