Introduction
Lorsque vous travaillez avec des données accessibles publiquement sur AWS S3 — comme les produits satellitaires de la NOAA — il est souvent utile d’obtenir par programmation la liste de tous les fichiers ou des sous-répertoires (répertoires simulés) à l’intérieur d’un chemin donné (appelé prefix) d’un bucket.
Dans ce guide, nous utilisons Python et la bibliothèque boto3
pour :
- Récupérer tous les noms de fichiers d’un dossier donné
- Récupérer tous les noms de répertoires (préfixes communs) à un chemin donné
Nous prendrons comme exemple le bucket public de la NOAA noaa-nesdis-snpp-pds
, qui contient une grande variété de produits satellitaires.
Installation
Installez boto3
si ce n’est pas déjà fait :
1 | pip install boto3 |
Lister Tous les Fichiers d’un Répertoire
Utilisez l’interface ressource S3 et filtrez par un préfixe pour obtenir tous les fichiers (objets) contenus dans un "répertoire" donné :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import boto3 from botocore import UNSIGNED from botocore.config import Config # Accès S3 anonyme s3 = boto3.resource('s3', config=Config(signature_version=UNSIGNED)) bucket_name = "noaa-nesdis-snpp-pds" folder = "VIIRS-IMG-GEO-TC/2023/05/30/" # Exemple de dossier s3_bucket = s3.Bucket(bucket_name) # Lister tous les fichiers .h5 dans ce dossier fichiers = [ obj.key for obj in s3_bucket.objects.filter(Prefix=folder) if obj.key.endswith(".h5") ] print(f"{len(fichiers)} fichiers trouvés") print("10 premiers fichiers :") for f in fichiers[:10]: print(f) |
Lister Tous les Sous-Répertoires (Dossiers)
Si vous voulez récupérer les sous-dossiers à l’intérieur d’un dossier, utilisez l’interface client de boto3
avec le paramètre Delimiter
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import boto3 from botocore import UNSIGNED from botocore.config import Config # Client S3 anonyme s3_client = boto3.client('s3', config=Config(signature_version=UNSIGNED)) bucket_name = "noaa-nesdis-snpp-pds" prefix = "" # Dossier racine ; vous pouvez mettre un sous-dossier ici response = s3_client.list_objects_v2( Bucket=bucket_name, Prefix=prefix, Delimiter="/" # Important pour obtenir les "répertoires" ) # Extraire les noms de dossiers folders = [cp['Prefix'] for cp in response.get('CommonPrefixes', [])] print("Dossiers trouvés :") for folder in folders: print(folder) |
Exemple de Résultat
En exécutant le code ci-dessus sur la racine du bucket noaa-nesdis-snpp-pds
, vous obtiendrez quelque chose comme :
1 2 3 4 5 6 7 8 9 10 11 | Dossiers trouvés : ATMS-SCIENCE-RDR/ ATMS-SDR-GEO/ ATMS-SDR/ ATMS-SFR/ ATMS-TDR/ ... VIIRS-IMG-GEO-TC/ VIIRS-NCC-EDR/ VIIRS_SurfaceReflectance_EDR/ VIIRS_VFM_MWS_MOSAIC/ |
Ce sont les noms de "répertoires" simulés dans le bucket S3, chacun correspondant à un type de produit ou de données.
Conseils et Astuces
- Buckets publics : Pour les données accessibles publiquement, utilisez
Config(signature_version=UNSIGNED)
pour désactiver l’authentification. - Format des préfixes : Ajoutez toujours un
/
à la fin de vos préfixes pour bien cibler un dossier. - Pagination : Par défaut, la réponse retourne au plus 1000 objets. Utilisez
ContinuationToken
pour paginer si besoin. - Vérification d’accès : Si vous obtenez une erreur d’accès, assurez-vous que le bucket est public ou que vos identifiants AWS sont correctement configurés.
Références
Ressource | Lien |
---|---|
Documentation Boto3 | https://boto3.amazonaws.com/v1/documentation/api/latest/index.html |
Bucket NOAA SNPP | https://noaa-nesdis-snpp-pds.s3.amazonaws.com/index.html |
list_objects_v2 de boto3 |
Lien |