2017-07-03 2 views
0

J'utilise boto3 pour télécharger des fichiers à partir s3, et je suis en train de déballer les valeurs de bucket.objects.all() itération:Déballer s3.ObjectSummary de bucket.objects.all() itération

bucket = boto3.Session(profile_name='default').resource('s3').Bucket(bucket_name) 
for (bucket_name, key) in zip(bucket.objects.all()): 
    print(bucket_name, key) 

Mais retourne l'erreur suivante:

ValueError: not enough values to unpack (expected 2, got 1) 

ce que je fais mal?

+0

Vérifiez la valeur de 'zip (bucket.objects.all())' exactement, si vous n'avez pas de liste de tuples avec deux membres, vous ne pouvez pas utiliser cette syntaxe dans une boucle for – PRMoureu

+0

La valeur est : (s3.ObjectSummary (bucket_name = 'un certain seau', clé = 'RE.xlsx'),) –

+0

donc vous n'avez qu'un seul objet, vous devez extraire les attributs de cet objet avant de le déballer pour correspondre à 'bucket_name' et "clé" – PRMoureu

Répondre

0

Vous pouvez essayer cette partie au lieu de zip(bucket.objects.all()):

map(lambda x: (x.bucket_name, x.key), bucket.objects.all()) 

la fonction map permet d'appliquer la fonction lambda (premier paramètre) à chacun des membres du second paramètre bucket.objects.all() qui retourne une liste de ObjectSummary.

map retourne une liste que vous pouvez faire une boucle

Le lambda retourne un tuple de 2 valeurs afin que vous puissiez les déballer.