Schnellster Weg zur Datentypkonvertierung mit csv.DictReader in Python

8

Ich arbeite mit einer CSV-Datei in Python, die ~ 100.000 Zeilen haben wird, wenn sie benutzt wird. Jede Zeile enthält eine Reihe von Dimensionen (als Zeichenfolgen) und eine einzelne Metrik (Gleitkommazahl).

Da csv.DictReader oder csv.reader Werte nur als String zurückgeben, durchläuft ich gerade alle Zeilen und konvertiere den einen numerischen Wert in einen float.

%Vor%

Gibt es einen besseren Weg, als dass jemand das vorschlagen könnte? Ich habe mit verschiedenen Kombinationen von map, izip, itertools herumgespielt und habe ausgiebig nach einigen Samples gesucht, um es effizienter zu machen, habe aber leider nicht viel Erfolg gehabt.

Falls es hilft: Ich mache das auf Appengine. Ich glaube , dass das, was ich mache, dazu führen kann, dass ich diesen Fehler treffe: Überschreitet die Grenze für das Soft-Prozess-Limit mit 267.789 MB nach dem Service 11 Anfragen insgesamt - ich bekomme es nur, wenn die CSV ziemlich groß ist.

Bearbeiten: Mein Ziel Ich analysiere diese CSV-Datei, sodass ich sie als Datenquelle für die Google Visualisierungs-API . Der endgültige Datensatz wird in eine gviz DataTable zur Abfrage geladen. Typ muss während der Erstellung dieser Tabelle angegeben werden. Mein Problem könnte auch gelöst werden, wenn jemand von einem guten gviz csv- & gt; Datatable Konverter in Python wusste!

Bearbeiten2: Mein Code

Ich glaube, dass mein Problem damit zu tun hat, wie ich versuche, FixCsvTypes () zu reparieren. Außerdem erwartet data_table.LoadData () ein iterierbares Objekt.

%Vor%     
oli 04.02.2011, 12:26
quelle

3 Antworten

2

Ich hatte zuerst die CSV-Datei mit einer Regex ausgenutzt, aber da die Daten in der Datei sehr streng in jeder Zeile angeordnet sind, können wir einfach die Funktion split () verwenden

%Vor%

Oder ohne eine zu definierende Funktion:

%Vor%

In einem Moment glaubte ich, dass ich gezwungen war, die Datentabelle mit jeweils einer Zeile zu füllen, da ich eine Regex verwendete und die Gruppen der Übereinstimmungen abrufen musste, bevor die Strings der Zahlen schwebten. Mit split () kann alles in einer Anweisung mit LoadData ()

erledigt werden

.

Daher kann Ihr Code gekürzt werden. Übrigens sehe ich nicht, warum es weiterhin eine Klasse definieren sollte. Stattdessen scheint mir eine Funktion genug zu sein:

%Vor%

.

Nun müssen Sie prüfen, ob die Art, in der die CSV-Daten von einer anderen API gelesen werden, in diesen Code eingefügt werden kann, damit das Iterationsprinzip die Datentabelle auffüllt.

    
eyquem 05.02.2011, 17:33
quelle
1

Zunächst müssen Sie keine Konvertierung durchführen, wenn Sie diese Daten nur visualisieren müssen: gviz kann JSON (textbasiert, Sie wissen) oder CSV ( Sie haben es bereits, kein Parsen erforderlich!). Sie können die fragliche Datei auf jedem vernünftigen Web-Server ablegen und den Zugriff auf die GVT-Anfragen mit gviz-Problemen ermöglichen, indem Sie die Parameter ignorieren.

Nehmen wir an, Sie brauchen eine Verarbeitung. Es sieht so aus, als ob Sie nicht nur die CSV-Datei lesen, sondern auch versuchen, sie vollständig im Arbeitsspeicher zu speichern. Dies kann unpraktisch sein: Sie werden schneller und schneller auf das RAM-Limit treffen, wenn Sie mehr Verarbeitung hinzufügen. Verarbeiten Sie Daten Zeile für Zeile (oder eine angemessene Anzahl von Zeilen, wenn Sie Fensterfilter anwenden usw.) und verarbeitete Zeilen in den Datenspeicher und nicht in eine Liste usw. Wenn Sie Daten über eine GET-Anfrage senden, lesen Sie Verarbeite eine Zeile, schreibe sie in die Antwort und lege sie nicht in eine Liste oder Ähnliches.

Ich sehe kein Problem mit der Umwandlungstechnik, solange Sie i später im Code verwenden und nicht alle i s auswendig lernen, während Sie gehen.

    
9000 04.02.2011 14:28
quelle
1

Es gibt zwei verschiedene Dinge: "Datenquelle" und "Datentabelle".

"Datenquelle" ist der Name der formatierten Daten, die vom Google Visualization API-Server als Visualisierungs-Webdienst bereitgestellt werden:

%Vor%

Der Name "Datenquelle" enthält den Begriff "Drahtprotokoll":

%Vor%

Um die "Datenquelle" zu implementieren, gibt es zwei Möglichkeiten:

%Vor%

Von den folgenden:

%Vor%

Ich verstehe, dass wir von Grund auf das Drahtprotokoll + die Erstellung einer "Datentabelle" implementieren müssen, während wir mit einer Datenquellenbibliothek nur die "Datentabelle" erstellen müssen.

Es gibt Seiten zum Erstellen einer "Datenquelle"

Ссылка

Ссылка

Meiner Meinung nach handelt es sich bei dem Beispiel unter der Adresse Ссылка um die Erstellung einer "Datenquelle" und die dort getroffene Antwort ist zweifelhaft. Aber das ist mir nicht sehr klar.

Aber diese Seiten und das Thema sind nicht die interessanten für Sie, die in der Tat, wenn ich es gut verstehe, wissen möchten, wie die Daten, die als "Datentabellen" bekannt sind, über die "Datenquelle" bereitgestellt werden ", aber nicht die Konstruktion der" Datenquelle ".

%Vor%

Also, die Vorbereitung der "Datentabelle" ist der entscheidende Punkt.

Hier ist es:

%Vor%

Weitere Informationen finden Sie hier:

%Vor%

Schließlich würde ich sagen, dass Sie für Ihr Problem ein "Tabellenschema" definieren und Ihre CSV-Datei verarbeiten müssen, um a structure of data elements in the exact same structure as the table schema.

zu erhalten

Die Definition des Datentyps in einer Spalte erfolgt in der Definition des "Tabellenschemas". Wenn die "Datentabelle" mit Daten gefüllt werden soll, die den richtigen Typ haben (keine Zeichenfolge, möchte ich sagen), helfe ich Ihnen, den Code für die Extraktion von Daten aus der CSV zu schreiben, es ist einfach zu machen.

>

Im Moment hoffe ich, dass das alles richtig ist und Ihnen helfen wird

    
eyquem 04.02.2011 20:30
quelle