Comment Obtenir Tous les Noms de Fichiers ou de Répertoires dans un Dossier Spécifique d’une Bucket S3 AWS en Python ?

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