Einlesen der CSV-Dateien in numpy, wo Trennzeichen ist ","
Ich habe eine CSV-Datei mit einem format, das wie folgt aussieht:
"FieldName1", "FieldName2", "FieldName3", "FieldName4"
"04/13/2010 14:45:07.008", "7.59484916392", "10", "6.552373"
"04/13/2010 14:45:22.010", "6.55478493312", "9", "3.5378543"
...
Beachten Sie, dass es doppelte Anführungszeichen am Anfang und Ende jeder Zeile in der CSV-Datei, und die ","
string wird verwendet, um getrennte Felder in jeder Zeile. Die Anzahl der Felder in der CSV-Datei kann variieren von Datei zu Datei.
Wenn ich versuche, dies zu Lesen in numpy über:
import numpy as np
data = np.genfromtxt(csvfile, dtype=None, delimiter=',', names=True)
alle Daten bekommt Lesen Sie in als string-Werte, umgeben von double-quote-Zeichen. Nicht unvernünftig, aber nicht viel nutzen für mich, als ich dann zurück gehen und konvertieren jede Spalte auf Ihren korrekten Typ
Wenn ich delimiter='","'
statt, alles funktioniert, wie ich möchte, außer für die 1. und letzten Felder. Als start-of-line-und end-of-line Zeichen ein einzelnes doppeltes Anführungszeichen, das ist nicht als eine gültige Trennzeichen für die 1. und letzten Felder, so werden Sie Lesen, wie z.B. "04/13/2010 14:45:07.008
und 6.552373"
- Hinweis: die führende und schließende double-quote Zeichen beziehungsweise. Wegen dieser redundanten Zeichen, numpy übernimmt der 1. und letzten Felder sind beide String-Typen; ich will nicht, dass das der Fall
Ist es eine Art zu unterrichten numpy Lesen Sie in Dateien formatiert auf diese Weise, wie ich möchte, ohne zurück zu gehen und "reparieren" die Struktur der numpy-array nach dem ersten Lesen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das grundlegende problem ist, dass NumPy nicht verstehen, das Konzept der Strippen Zitate (in der Erwägung, dass die
csv
- Modul). Wenn Sie sagendelimiter='","'
, du erzählst NumPy, dass das Spalten-Trennzeichen ist wörtlich zitiert Komma, d.h. die Angebote sind rund um das Komma, nicht der Wert, so dass die zusätzlichen Anführungszeichen erhalten Sie auf er ersten und letzten Spalten zu erwarten sind.Blick auf die Funktion docs, denke ich, werden Sie brauchen, um die
converters
parameter strip-Zitate für Sie (die standardmäßig nicht):Oder aufgeben
np.genfromtxt()
und lassencsv.csvreader
geben Sie den Inhalt der Datei eine Zeile zu einem Zeitpunkt, als Liste von strings, dann hast du einfach iterieren durch die Elemente, und erstellen Sie die matrix:EDIT: Okay, so sieht es aus wie deine Datei gar nicht schwimmt. In diesem Fall können Sie
convs
Bedarfgenfromtxt
Fall, oder erstellen Sie einen Vektor von Funktionen für die Konvertierung in diecsv.csvreader
Fall:EDIT 2: Okay, variable Spalte zählen... Ihre Daten-Quelle will einfach nur das Leben schwer machen. Zum Glück, können wir nur verwenden
magic
...... wo
magic()
ist nur ein name, den ich aus der Spitze von meinem Kopf für eine Funktion. (Psyche!)Im schlimmsten Fall, es könnte etwas sein wie:
Vielleicht NumPy hat eine Funktion, die einen string und gibt ein einzelnes element mit dem richtigen Typ.
numpy.fromstring()
sieht nah, aber es könnte interpretieren den Raum in Ihrem Zeitstempel als Spaltentrennzeichen.P. S. Ein Nachteil mit
csvreader
ich sehe, ist, dass es nicht zu verwerfen-Kommentare; realcsv
- Dateien keine Kommentare haben.str.replace('"', '')
Methode ausführen sollten, deutlich schneller als der reguläre Ausdruck, wenn die input-Datei ist groß (viele MBs oder GBs), und wird richtig sein, wenn man davon ausgehen kann das"
Zeichen wird nicht angezeigt, in der Mitte ein Feld, nur an den enden.re.compile()
denn nur mitre.match()
direkt speichert die kompilierten regulären Ausdruck sowieso.re.compile
sowieso, da es mir erlaubt, die Namen meiner regulären Ausdrücken.