azure-storage-file-share-py

npx skills add https://github.com/microsoft/skills --skill azure-storage-file-share-py

Azure Storage File Share SDK pour Python

Gérez les partages de fichiers SMB pour les scénarios cloud-native et lift-and-shift.

Installation

pip install azure-storage-file-share

Variables d'environnement

AZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...;AccountKey=...  # Alternative à l'authentification Entra ID
# Ou
AZURE_STORAGE_ACCOUNT_URL=https://<account>.file.core.windows.net  # Obligatoire pour l'authentification Entra ID
AZURE_TOKEN_CREDENTIALS=prod # Obligatoire uniquement si DefaultAzureCredential est utilisé en production

Authentification

Chaîne de connexion

from azure.storage.fileshare import ShareServiceClient

service = ShareServiceClient.from_connection_string(
    os.environ["AZURE_STORAGE_CONNECTION_STRING"]
)

Entra ID

from azure.storage.fileshare import ShareServiceClient
from azure.identity import DefaultAzureCredential, ManagedIdentityCredential

# Dev local : DefaultAzureCredential. Production : définissez AZURE_TOKEN_CREDENTIALS=prod ou AZURE_TOKEN_CREDENTIALS=<credential_specifique>
credential = DefaultAzureCredential(require_envvar=True)
# Ou utilisez une credential spécifique directement en production :
# Voir https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes
# credential = ManagedIdentityCredential()

service = ShareServiceClient(
    account_url=os.environ["AZURE_STORAGE_ACCOUNT_URL"],
    credential=credential
)

Opérations sur les partages

Créer un partage

share = service.create_share("my-share")

Lister les partages

for share in service.list_shares():
    print(f"{share.name}: {share.quota} GB")

Obtenir un client de partage

share_client = service.get_share_client("my-share")

Supprimer un partage

service.delete_share("my-share")

Opérations sur les répertoires

Créer un répertoire

share_client = service.get_share_client("my-share")
share_client.create_directory("my-directory")

# Répertoire imbriqué
share_client.create_directory("my-directory/sub-directory")

Lister les répertoires et fichiers

directory_client = share_client.get_directory_client("my-directory")

for item in directory_client.list_directories_and_files():
    if item["is_directory"]:
        print(f"[DIR] {item['name']}")
    else:
        print(f"[FILE] {item['name']} ({item['size']} bytes)")

Supprimer un répertoire

share_client.delete_directory("my-directory")

Opérations sur les fichiers

Charger un fichier

file_client = share_client.get_file_client("my-directory/file.txt")

# À partir d'une chaîne
file_client.upload_file("Hello, World!")

# À partir d'un fichier
with open("local-file.txt", "rb") as f:
    file_client.upload_file(f)

# À partir d'octets
file_client.upload_file(b"Binary content")

Télécharger un fichier

file_client = share_client.get_file_client("my-directory/file.txt")

# Vers des octets
data = file_client.download_file().readall()

# Vers un fichier
with open("downloaded.txt", "wb") as f:
    data = file_client.download_file()
    data.readinto(f)

# Chunks en streaming
download = file_client.download_file()
for chunk in download.chunks():
    process(chunk)

Obtenir les propriétés du fichier

properties = file_client.get_file_properties()
print(f"Size: {properties.size}")
print(f"Content type: {properties.content_settings.content_type}")
print(f"Last modified: {properties.last_modified}")

Supprimer un fichier

file_client.delete_file()

Copier un fichier

source_url = "https://account.file.core.windows.net/share/source.txt"
dest_client = share_client.get_file_client("destination.txt")
dest_client.start_copy_from_url(source_url)

Opérations sur les plages

Charger une plage

# Charger vers une plage spécifique
file_client.upload_range(data=b"content", offset=0, length=7)

Télécharger une plage

# Télécharger une plage spécifique
download = file_client.download_file(offset=0, length=100)
data = download.readall()

Opérations sur les snapshots

Créer un snapshot

snapshot = share_client.create_snapshot()
print(f"Snapshot: {snapshot['snapshot']}")

Accéder à un snapshot

snapshot_client = service.get_share_client(
    "my-share",
    snapshot=snapshot["snapshot"]
)

Client asynchrone

from azure.storage.fileshare.aio import ShareServiceClient
from azure.identity.aio import DefaultAzureCredential

async def upload_file():
    credential = DefaultAzureCredential()
    service = ShareServiceClient(account_url, credential=credential)

    share = service.get_share_client("my-share")
    file_client = share.get_file_client("test.txt")

    await file_client.upload_file("Hello!")

    await service.close()
    await credential.close()

Types de clients

Client Objectif
ShareServiceClient Opérations au niveau du compte
ShareClient Opérations sur les partages
ShareDirectoryClient Opérations sur les répertoires
ShareFileClient Opérations sur les fichiers

Bonnes pratiques

  1. Utiliser une chaîne de connexion pour la configuration la plus simple
  2. Utiliser Entra ID en production avec RBAC
  3. Streamer les gros fichiers en utilisant chunks() pour éviter les problèmes de mémoire
  4. Créer des snapshots avant les changements majeurs
  5. Définir des quotas pour prévenir les coûts de stockage inattendus
  6. Utiliser les plages pour les mises à jour partielles de fichiers
  7. Fermer les clients asynchrones explicitement

Skills similaires