Wie lese ich eine csv gespeichert in S3 mit csv.DictReader?
Ich habe code, der holt sich ein AWS-S3-Objekt. Wie lese ich diese StreamingBody mit Python csv.DictReader?
import boto3, csv
session = boto3.session.Session(aws_access_key_id=<>, aws_secret_access_key=<>, region_name=<>)
s3_resource = session.resource('s3')
s3_object = s3_resource.Object(<bucket>, <key>)
streaming_body = s3_object.get()['Body']
#csv.DictReader(???)
csv.DictReader(streaming_body)
?csv.DictReader(streaming_body)
gibt den Fehler "TypeError: argument 1 muss ein iterator". Laufen, Lesen() und decode() auf, bevor Sie ihn (was ich lieber nicht tun, da das laden, die ganze Datei im Speicher) gibt jedes Zeichen von der Datei getrennt.InformationsquelleAutor Jon | 2017-02-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Würde der code so etwas wie dieses:
Können Sie kompakte ein bisschen im eigentlichen code, aber ich habe versucht, es Schritt für Schritt zu zeigen, die Objekt-Hierarchie mit boto3.
Edit Pro Ihren Kommentar über die Vermeidung liest die gesamte Datei in den Speicher: ich habe noch nicht auf, dass die Anforderungen so nicht sprechen autoritativ, aber ich würde versuchen das einwickeln der stream so konnte ich eine text-Datei-wie iterator. Zum Beispiel könnten Sie die codecs Bibliothek zu ersetzen, um die csv-parsing-Bereich oben mit etwas wie:
Ja. Jeder Weg, es zu tun, so dass ich nicht Lesen() die gesamte Datei in den Speicher?
Die
codecs.getreader()
Lösung hat bei mir für genau dieses problemDer obige code hat nicht funktioniert für mich, wie es ist, sondern arbeitete mit einer leichten Modifikation:
response['Body'].read().decode('utf-8').split()
. Ich bin mit Python 3.7InformationsquelleAutor gary