Können Sie upload auf S3 mit einem stream anstatt einer lokalen Datei?
Brauche ich zum erstellen einer CSV und laden Sie Sie auf einem S3-bucket. Da bin ich erstellen, die Datei auf der fliege, es wäre besser, wenn ich könnte schreiben Sie es direkt auf S3-bucket, wie es erstellt wird sondern schreiben die ganze Datei lokal, und dann das hochladen der Datei am Ende.
Gibt es eine Möglichkeit, dies zu tun? Mein Projekt ist in Python und ich bin ziemlich neu in der Sprache. Hier ist, was ich bisher ausprobiert:
import csv
import csv
import io
import boto
from boto.s3.key import Key
conn = boto.connect_s3()
bucket = conn.get_bucket('dev-vs')
k = Key(bucket)
k.key = 'foo/foobar'
fieldnames = ['first_name', 'last_name']
writer = csv.DictWriter(io.StringIO(), fieldnames=fieldnames)
k.set_contents_from_stream(writer.writeheader())
Erhielt ich diese Fehlermeldung: BotoClientError: s3 nicht unterstützt chunked transfer
UPDATE: ich habe einen Weg gefunden, um direkt schreiben auf S3, aber ich kann nicht einen Weg finden, deaktivieren Sie den Puffer, ohne tatsächlich löschen der Zeilen habe ich bereits geschrieben. So zum Beispiel:
conn = boto.connect_s3()
bucket = conn.get_bucket('dev-vs')
k = Key(bucket)
k.key = 'foo/foobar'
testDict = [{
"fieldA": "8",
"fieldB": None,
"fieldC": "888888888888"},
{
"fieldA": "9",
"fieldB": None,
"fieldC": "99999999999"}]
f = io.StringIO()
fieldnames = ['fieldA', 'fieldB', 'fieldC']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
k.set_contents_from_string(f.getvalue())
for row in testDict:
writer.writerow(row)
k.set_contents_from_string(f.getvalue())
f.close()
Schreibt 3 Zeilen in die Datei, aber ich bin nicht in der Lage, um Speicher freizugeben, zu schreiben, eine große Datei. Wenn ich auf add:
f.seek(0)
f.truncate(0)
auf die Schleife, dann wird nur die Letzte Zeile der Datei geschrieben wird. Gibt es eine Möglichkeit, Ressourcen freizugeben, ohne das löschen von Zeilen aus der Datei?
InformationsquelleAutor der Frage inquiring minds | 2015-06-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich eine Lösung auf meine Frage, die ich hier posten falls jemand interessiert ist. Ich beschloss, dies zu tun als Teile einer multipart-upload. Sie können nicht streamen S3. Es gibt auch ein Paket zur Verfügung, dass änderungen Ihrer streaming-Datei in eine multipart-upload die ich verwendet habe: Smart Open.
InformationsquelleAutor der Antwort inquiring minds
Laut docs es möglich
so können wir
StringIO
in der üblichen WeiseUpdate: smart_open lib von @fragender Geist Antwort ist die bessere Lösung
InformationsquelleAutor der Antwort El Ruso