Boto3, um alle Dateien von einem S3-Bucket herunterzuladen
Ich bin mit boto3, um Dateien von s3-bucket. Ich brauche eine ähnliche Funktionalität wie aws s3 sync
Mein Aktueller code ist
#!/usr/bin/python
import boto3
s3=boto3.client('s3')
list=s3.list_objects(Bucket='my_bucket_name')['Contents']
for key in list:
s3.download_file('my_bucket_name', key['Key'], key['Key'])
Dies ist in Ordnung, solange der Eimer hat nur Dateien.
Wenn ein Ordner vorhanden ist, in den Eimer, dessen Ausgabe einer Fehlermeldung
Traceback (most recent call last):
File "./test", line 6, in <module>
s3.download_file('my_bucket_name', key['Key'], key['Key'])
File "/usr/local/lib/python2.7/dist-packages/boto3/s3/inject.py", line 58, in download_file
extra_args=ExtraArgs, callback=Callback)
File "/usr/local/lib/python2.7/dist-packages/boto3/s3/transfer.py", line 651, in download_file
extra_args, callback)
File "/usr/local/lib/python2.7/dist-packages/boto3/s3/transfer.py", line 666, in _download_file
self._get_object(bucket, key, filename, extra_args, callback)
File "/usr/local/lib/python2.7/dist-packages/boto3/s3/transfer.py", line 690, in _get_object
extra_args, callback)
File "/usr/local/lib/python2.7/dist-packages/boto3/s3/transfer.py", line 707, in _do_get_object
with self._osutil.open(filename, 'wb') as f:
File "/usr/local/lib/python2.7/dist-packages/boto3/s3/transfer.py", line 323, in open
return open(filename, mode)
IOError: [Errno 2] No such file or directory: 'my_folder/.8Df54234'
Ist dies eine richtige Weg zum download einer kompletten s3-bucket mit boto3. Wie zum download Ordner.
InformationsquelleAutor der Frage Shan | 2015-08-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe die gleichen Bedürfnisse und erstellen Sie die folgende Funktion, die das herunterladen rekursiv die Dateien.
Die Verzeichnisse sind lokal erzeugten, nur, wenn Sie Dateien enthalten.
Die Funktion aufgerufen wird, die Art und Weise:
InformationsquelleAutor der Antwort glefait
Amazon S3 keine Ordner/Verzeichnisse. Es ist ein flat-file-Struktur.
Pflegen das Erscheinungsbild der Verzeichnisse, Pfadnamen gespeichert werden als Teil des objektschlüssels (mit dem Namen). Zum Beispiel:
images/foo.jpg
In diesem Fall können Sie ganze Schlüssel
images/foo.jpg
anstatt nurfoo.jpg
.Ich vermute, dass dein problem ist, dass
boto
ist wieder eine Datei namensmy_folder/.8Df54234
und wird versuchen, Sie zu speichern auf das lokale Dateisystem. Aber Ihrem lokalen Dateisystem interpretiert diemy_folder/
Teil als directory-name, und das Verzeichnis existiert nicht auf Ihrem lokalen Dateisystem.Können Sie entweder abschneiden den Dateinamen zu speichern nur die
.8Df54234
Teil, oder Sie müssten erstellen Sie die erforderlichen Verzeichnissebevor das schreiben von Dateien. Beachten Sie, dass es sein könnte, multi-level-verschachtelte Verzeichnisse.Ein einfacher Weg wäre, um die AWS Command Line Interface (CLI)die werden alles tun, diese Arbeit für Sie, z.B.:
Es gibt auch eine
sync
option, die nur kopieren, neue und geänderte Dateien.InformationsquelleAutor der Antwort John Rotenstein
InformationsquelleAutor der Antwort Tushar Niras
Ich bin derzeit erreichen die Aufgabe, mithilfe der folgenden
Obwohl, es macht den job, ich bin nicht sicher, dass seine gut zu tun auf diese Weise.
Ich bin verlassen, es ist hier, um zu helfen, andere Benutzer und die weiteren Antworten, mit einer besseren Art und Weise, dies zu erreichen,
InformationsquelleAutor der Antwort Shan
Besser spät als nie:) Die Vorherige Antwort mit dem paginator ist wirklich gut. Aber es ist rekursiv, und Sie könnten am Ende schlagen Python-Rekursion Grenzen. Hier ist ein alternativer Ansatz, mit ein paar extra Kontrollen.
InformationsquelleAutor der Antwort ifoukarakis
Es ist eine sehr schlechte Idee, um alle Dateien in einem Rutsch, sollte man sich lieber Holen Sie es in den Reihen.
Einer Umsetzung, die ich verwenden, um zu Holen einen bestimmten Ordner (Verzeichnis) von S3 ist,
und immer noch, wenn Sie wollen, um die ganzen Eimer via CIL als @John Rotenstein erwähnt als unten,
InformationsquelleAutor der Antwort Ganatra
Habe ich einen workaround für diese läuft die AWS CLI im gleichen Prozess.
Installieren
awscli
als python-lib:Dann definieren Sie diese Funktion:
Ausführen:
InformationsquelleAutor der Antwort mattalxndr