Ich habe eine große lokale Datei. Ich möchte eine gezippte Version dieser Datei mit der boto
-Bibliothek in S3 hochladen. Die Datei ist zu groß, um sie vor dem Hochladen effizient auf der Festplatte zu speichern. Daher sollte sie während des Uploads gezippt werden.
Die boto
-Bibliothek kennt eine Funktion set_contents_from_file()
, die ein dateiähnliches Objekt erwartet, aus dem sie liest.
Die Bibliothek gzip
kennt die Klasse GzipFile
, die ein Objekt über den Parameter fileobj
; Es wird beim Komprimieren in dieses Objekt schreiben.
Ich möchte diese beiden Funktionen kombinieren, aber die eine API möchte selbst lesen, die andere API möchte selbst schreiben; Keiner kennt eine passive Operation (wie geschrieben oder gelesen wird).
Hat jemand eine Idee, wie man diese auf eine funktionierende Art und Weise kombiniert?
BEARBEITEN: Ich habe eine Antwort akzeptiert (siehe unten), weil sie mich darauf hinwies, wo ich hingehen sollte. Aber wenn Sie das gleiche Problem haben, könnte meine eigene Antwort (auch unten) hilfreicher sein, weil ich eine Lösung mit multipart implementiert habe lädt darin hoch.
Ich habe die in den Kommentaren der angenommenen Antwort von garnaat angedeutete Lösung implementiert:
%Vor%Es scheint ohne Probleme zu funktionieren. Und schließlich ist Streaming in den meisten Fällen nur ein Chunking der Daten. In diesem Fall sind die Chunks etwa 10 MB groß, aber wen interessiert das schon? Solange wir nicht über mehrere GB-Chunks sprechen, geht es mir gut.
Update für Python 3:
%Vor%