Ich muss eine CSV erstellen und in einen S3-Bucket hochladen. Da ich die Datei im Handumdrehen erstelle, wäre es besser, wenn ich sie direkt in S3-Bucket schreiben könnte, während sie erstellt wird, anstatt die ganze Datei lokal zu schreiben und dann die Datei am Ende hochzuladen.Können Sie mit einem Stream anstelle einer lokalen Datei in S3 hochladen?
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 versuchte, so weit:
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())
ich diesen Fehler erhalten: BotoClientError: s3 nicht segmentierte Übertragungs unterstützt
UPDATE: Ich einen Weg gefunden direkt auf S3 zu schreiben, aber ich kann nicht finde einen Weg, den Puffer zu löschen, ohne die Zeilen zu löschen, die ich bereits geschrieben habe. 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 Speicher freizugeben eine große Datei zu schreiben. Wenn ich hinzufügen:
f.seek(0)
f.truncate(0)
in die Schleife, dann wird nur die letzte Zeile der Datei geschrieben. Gibt es eine Möglichkeit, Ressourcen freizugeben, ohne Zeilen aus der Datei zu löschen?
Auch
StringIO
in gewöhnlicher Weise verwenden, wenn Sie S3 schreiben könnte, wie Sie wollen, würde ich es nicht auf Konsistenz Herausforderungen empfehlen . Warum denkst du, es wäre besser, nicht lokal zu schreiben? Möchten Sie ein teilweises S3-Objekt, wenn eine Ausnahme oder ein Problem aufgetreten ist? Ich nehme nicht an. – cgsellerIch wollte direkt schreiben, um ein wenig effizienter zu sein. Im Wesentlichen, wenn ich die Datei lokal schreibe und hochlade, füge ich das Hochladen als zusätzlichen Schritt hinzu und bereinige die lokale Datei. Es macht mir nichts aus, eine unvollständige Datei zu haben - ich könnte eine unvollständige Datei haben, wenn ich sie auch lokal schreibe. Das System wird idempotent sein und entweder eine Datei in einem Fehlerzustand löschen oder fortsetzen. –