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