Wie kann ich list directory contents von einem S3-bucket mit Python und Boto3?
Ich versuche, um eine Liste aller Verzeichnisse in einem S3-bucket mit Python und Boto3.
Ich bin mit dem folgenden code:
s3 = session.resource('s3') # I already have a boto3 Session object
bucket_names = [
'this/bucket/',
'that/bucket/'
]
for name in bucket_names:
bucket = s3.Bucket(name)
for obj in bucket.objects.all(): # this raises an exception
# handle obj
Wenn ich diesen starte bekomme ich folgende exception stack trace:
File "botolist.py", line 67, in <module>
for obj in bucket.objects.all():
File "/Library/Python/2.7/site-packages/boto3/resources/collection.py", line 82, in __iter__
for page in self.pages():
File "/Library/Python/2.7/site-packages/boto3/resources/collection.py", line 165, in pages
for page in pages:
File "/Library/Python/2.7/site-packages/botocore/paginate.py", line 83, in __iter__
response = self._make_request(current_kwargs)
File "/Library/Python/2.7/site-packages/botocore/paginate.py", line 155, in _make_request
return self._method(**current_kwargs)
File "/Library/Python/2.7/site-packages/botocore/client.py", line 270, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/Library/Python/2.7/site-packages/botocore/client.py", line 335, in _make_api_call
raise ClientError(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (NoSuchKey) when calling the ListObjects operation: The specified key does not exist.
Was ist der richtige Weg, um die Liste Verzeichnisse in einen Eimer?
Vielen Dank im Voraus...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alle diese anderen Antworten zu saugen. Mit
Grenzen, die Sie zu 1k Ergebnisse max. Der rest der Antworten sind entweder falsch oder zu Komplex.
Umgang mit der Fortsetzung token selbst ist eine schreckliche Idee. Verwenden Sie einfach paginator, die sich mit der Logik, für Sie
Die Lösung, die Sie wollen, ist:
paginate
kann mehr Parameter als nurBucket
, so zum Beispiel, wenn Sie wollte Suche nach einem bestimmten Eimer für Objekte, die nur enthalten einem bestimmten Präfix, könnte man sagen[e['Key'] for p in s3g.client.get_paginator("list_objects_v2").paginate(Bucket='my_bucket', Prefix='foo/bar') for e in p['Contents']]
Alternativ können Sie verwenden möchten
boto3.client
Beispiel
list_objects
unterstützt auch andere Argumente, die erforderlich sein könnten, zu iterieren, obwohl das Ergebnis: Eimer, Trennzeichen, EncodingType, Marker, MaxKeys, PräfixWenn Sie die Sitzung, erstellen Sie einen client und Holen Sie sich die
CommonPrefixes
des Kundenlist_objects
:Es könnte eine Menge von Ordnern, und möchten Sie vielleicht starten Sie in einen Unterordner, obwohl. So etwas umgehen konnte, dass:
Den besten Weg, um die Liste ALLER Objekte, die mit einem bestimmten Präfix in einen S3-bucket ist mit
list_objects_v2
zusammen mitContinuationToken
zur überwindung der 1000-Objekt-Paginierung-Grenze.Hätte ich gedacht, dass Sie nicht mit einem Schrägstrich in einem Eimer Namen. Sie sagen, Sie wollen, um eine Liste aller Verzeichnisse in einem Eimer, aber dein code versucht, um eine Liste aller Inhalte (nicht unbedingt Verzeichnisse) innerhalb einer Anzahl der buckets. Diese Eimer wohl nicht existieren (weil Sie illegale Namen). Also, wenn Sie Sie ausführen
Eimer ist wahrscheinlich null, und die nachfolgende Liste wird scheitern.