Récupération des noms de sous-dossiers dans le compartiment S3 à partir de boto3
À l'aide de boto3, je peux accéder à mon seau AWS S3:
s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket-name')
Maintenant, le seau contient un dossier first-level
qui lui-même contient plusieurs sous-dossiers nommés avec un timestamp, par exemple 1456753904534
.
J'ai besoin de savoir le nom de ces sous-dossiers pour un autre emploi, je suis en train de faire et je me demande si je pouvais avoir boto3 récupérer ces pour moi.
J'ai donc essayé:
objs = bucket.meta.client.list_objects(Bucket='my-bucket-name')
qui donne un dictionnaire, dont la clé "Contenu" donne-moi la troisième fichiers au niveau de la place du deuxième niveau de l'horodatage des répertoires, en fait-je obtenir une liste contenant les choses comme
{u'ETag': '"etag"', u Key': premier niveau/1456753904534/partie-00014', u'LastModified':
datetime.datetime(2016, 2, 29, 13, 52, 24, tzinfo=tzutc()),
u'Owner': {u'DisplayName': 'propriétaire', u ÎD':
'id'},
u'Size': taille, u'StorageClass': 'storageclass'}
vous pouvez voir que les fichiers spécifiques, dans ce cas part-00014
sont récupérées, alors que je voudrais obtenir le nom du répertoire à lui seul.
En principe, j'ai pu dépouiller le nom de répertoire de tous les chemins, mais c'est moche et cher à récupérer tout au troisième niveau pour obtenir le deuxième niveau!
J'ai aussi essayé quelque chose signalé ici:
for o in bucket.objects.filter(Delimiter='/'):
print(o.key)
mais je ne reçois pas les dossiers au niveau désiré.
Est-il un moyen de résoudre ce problème?
source d'informationauteur mar tin
Vous devez vous connecter pour publier un commentaire.
S3 est un objet de stockage, il n'a pas de réelle structure de répertoire. Le "/" est plutôt esthétique.
L'une des raisons que les gens veulent avoir une structure de répertoire, car ils peuvent maintenir/prune/ajouter un arbre à l'application. Pour S3, vous traiter ce type de structure comme une sorte d'index ou de tag de recherche.
Pour manipuler l'objet en S3, vous avez besoin boto3.client ou boto3.des ressources, par exemple
Pour la liste de tous les objets
http://boto3.readthedocs.org/en/latest/reference/services/s3.html#S3.Client.list_objects
Un rappel concernant boto3 : boto3.la ressource est une belle de haut niveau de l'API. Il y a des avantages et des inconvénients à l'aide de boto3.client vs boto3.de la ressource. Si vous développez interne de la bibliothèque partagée, à l'aide de boto3.la ressource de vous donner un blackbox couche sur les ressources utilisées.
Ci-dessous morceau de code ne renvoie que le "sous-dossiers" dans un "dossier" à partir de s3 seau.
Pour plus de détails, vous pouvez vous référer à https://github.com/boto/boto3/issues/134
Il m'a fallu beaucoup de temps à comprendre, mais voici enfin une façon simple de lister le contenu d'un dossier dans le compartiment S3 à l'aide de boto3. Espérons que cela aide
la dernière BOTO3 documentation recommande l'utilisation de list_objects_v2
http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.list_objects_v2
J'ai eu le même problème, mais a réussi à le résoudre à l'aide de
boto3.client
etlist_objects_v2
avecBucket
etStartAfter
paramètres.Le résultat de sortie pour le code ci-dessus affiche les éléments suivants:
Boto3 list_objects_v2 Documentation
Afin d'en extraire seulement le nom du répertoire pour
secondLevelFolder
j'ai juste utilisé la méthode pythonsplit()
:Le résultat de sortie pour le code ci-dessus affiche les éléments suivants:
Python split() Documentation
Si vous souhaitez obtenir le nom du répertoire ET le contenu du nom de l'élément, puis remplacez la ligne d'impression avec les éléments suivants:
Et les suivants seront de sortie:
Espère que cette aide
La suivante fonctionne pour moi... les objets S3:
À l'aide de:
nous obtenons:
Avec:
nous obtenons:
Le grand réalisation à S3 est qu'il n'y a pas de dossiers/répertoires touches juste. Le apparente de la structure de dossier est simplement ajouté au début du nom de fichier pour devenir la "Clé", afin d'afficher le contenu de
myBucket
'ssome/path/to/the/file/
vous pouvez essayer:qui vous donnerait quelque chose comme:
Tout d'abord, il n'y a pas de véritable dossier de concept dans S3.
Vous avez certainement peut avoir un fichier @
'/folder/subfolder/myfile.txt'
et pas de dossier ni de sous-dossier.De "simuler" un dossier dans S3, vous devez créer un fichier vide avec un '/' à la fin de son nom (voir Amazon S3 boto - comment créer un dossier?)
Pour votre problème, vous devriez probablement utiliser la méthode
get_all_keys
avec 2 paramètres :prefix
etdelimiter
https://github.com/boto/boto/blob/develop/boto/s3/bucket.py#L427
AWS cli est-ce (sans doute de l'extraction et de itérer sur toutes les touches dans le seau) lorsque vous exécutez
aws s3 ls s3://my-bucket/
alors je me suis dit il doit y avoir un moyen à l'aide de boto3.https://github.com/aws/aws-cli/blob/0fedc4c1b6a7aee13e2ed10c3ada778c702c22c3/awscli/customizations/s3/subcommands.py#L499
Il semble qu'ils l'ont, en effet, utiliser le Préfixe et le Délimiteur - j'ai été capable d'écrire une fonction qui serait me faire tous les répertoires à la racine d'un seau en modifiant ce code un peu: