Wie kann ich mit boto streamen einer Datei aus der Amazon S3, Rackspace Cloudfiles?
Ich bin das kopieren einer Datei von S3 zu Cloudfiles, und ich möchte vermeiden, schreiben die Datei auf die Festplatte. Die Python-Cloudfiles-Bibliothek ein Objekt hat.stream () - Aufruf, der sieht, was ich brauche, aber ich kann nicht finden, einen entsprechenden Aufruf in boto. Ich hoffe, dass ich in der Lage wäre, etwas zu tun:
shutil.copyfileobj(s3Object.stream(),rsObject.stream())
Ist das möglich mit boto (oder ich nehme an, jede andere s3-Bibliothek)?
smart_open Python-Bibliothek macht (beide für Lesen und schreiben).
InformationsquelleAutor joemastersemison | 2011-10-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem Key-Objekt in boto, stellt auf das Objekt im S3 verwendet werden kann, wie ein iterator, so dass Sie sollten in der Lage sein, so etwas zu tun:
Oder, wie im Fall von Ihrem Beispiel, Sie tun können:
S3.Objekt ist nicht durchsuchbar mehr.
S3.Objekt ist noch durchsuchbar , aber mit S3object['body'].iter_lines (), so etwas wie dieses
InformationsquelleAutor garnaat
Anderen Antworten in diesem thread sind mit boto, aber S3.Objekt ist nicht durchsuchbar mehr in boto3. So, der folgende Code FUNKTIONIERT NICHT, es produziert eine
TypeError: 's3.Object' object is not iterable
Fehlermeldung:In boto3, der Inhalt des Objekts ist verfügbar bei
S3.Object.get()['Body']
die nicht durchsuchbar sind, so dass die folgenden noch NICHT:So, eine alternative ist die Verwendung der read-Methode, aber diese lädt die GESAMTE S3-Objekt im Speicher, die beim Umgang mit großen Dateien ist nicht immer eine Möglichkeit:
Aber die
read
Methode erlaubt es, in deramt
parameter, der angibt, die Anzahl der bytes, die wir Lesen wollen aus den zugrunde liegenden stream. Diese Methode kann wiederholt aufgerufen werden, bis der gesamte stream gelesen wurde:Graben in
botocore.response.StreamingBody
code merkt man, dass der zugrunde liegende stream ist auch verfügbar, so könnten wir die Iteration wie folgt:Beim googeln habe ich auch gesehen, einige links, die könnte man benutzen, aber ich habe nicht versucht:
InformationsquelleAutor smallo
Ich herausfinden, dass zumindest einige der Menschen sehen, diese Frage wird sein wie ich, und wollen einen Weg, um stream eine Datei von boto Zeile für Zeile (oder durch Komma durch Komma oder andere Trennzeichen). Hier ist ein einfacher Weg, dies zu tun:
@garnaat die Antwort von oben ist immer noch toll und zu 100% wahr. Hoffentlich mir noch jemand hilft.
lines = re.split(r'[\n\r]+', byte)
- hilfreich für CSV-Dateien aus Excel exportiert werdennoch ein Hinweis: ich hatte, um
yield unfinished_line
nach derfor byte in f:
Schleife abgeschlossen wurde, andernfalls wird die Letzte Zeile nicht verarbeitetGibt es einen guten Grund, warum dies nicht Teil der Boto3 API? Wenn nicht, sollte man einen pull-request Einreichen, dies zu beheben? Ich würde super nach unten klopfen, so etwas!
gerne haben Sie es, wenn Sie mögen.
Mal sehen, wie dieser pull-request geht über in botocore: github.com/boto/botocore/pull/1034
InformationsquelleAutor Eli
Dies ist meine Lösung zu Verpacken-streaming-Körper:
Beispiel:
InformationsquelleAutor jzhou
Botocore ist
StreamingBody
hat eineiter_lines()
Methode:https://botocore.amazonaws.com/v1/documentation/api/latest/reference/response.html#botocore.response.StreamingBody.iter_lines
Also:
InformationsquelleAutor Vic