Können Sie einen Stream anstelle einer lokalen Datei auf S3 hochladen?

Ich muss eine CSV erstellen und in einen S3-Bucket hochladen. Da ich die Datei im laufenden Betrieb erstelle, ist es besser, sie direkt in den S3-Bucket zu schreiben, da sie gerade erstellt wird, als die gesamte Datei lokal zu schreiben und sie am Ende hochzuladen.

Gibt es eine Möglichkeit, dies zu tun? Mein Projekt ist in Python und ich bin ziemlich neu in der Sprache. Folgendes habe ich bisher versucht:

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 habe diesen Fehler erhalten: BotoClientError: s3 unterstützt keine Chunk-Übertragung

UPDATE: Ich habe einen Weg gefunden, direkt in S3 zu schreiben, aber ich kann keinen Weg finden, den Puffer zu löschen, ohne die Zeilen, die ich bereits geschrieben habe, tatsächlich zu löschen. Also 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, ich kann jedoch keinen Speicher freigeben, um eine große Datei zu schreiben. Wenn ich hinzufüge:

f.seek(0)
f.truncate(0)

zur 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?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage