.CSV-Dateien auslesen und Header automatisch überspringen
Verfasst: Mittwoch 7. November 2018, 14:16
Hallo,
ich möchte aus einer .csv-Datei eine Matrix (np.array) lesen und damit dann weiter arbeiten...Problem ist, dass ich manchmal bei den Dateien einen Header habe und manchmal nicht. Ich kann das nicht festlegen und muss es daher abfangen!
Bisher lese ich die Dateien wie folgt aus:
Ich benutze bewusst dieses Format, da ich dann gleich die Zahlen in meinem benötigten np.array-Format habe. Den Dateiname erhalte ich aus einer anderen Funktion....das ganze funktioniert auch Einwandfrei....
Wenn allerdings einen Header in der Datei habe, bekomme ich eine Fehlermeldung....
Den header kann ich ja wie folgt überspringen (in diesem Fall ist er 18 Zeilen lang):
Wenn ich allerdings mit dieser Methode eine Datei ohne Header einlese, schnippelt er mir die ersten 18 Zeilen weg, was bei meiner Anwendung nicht sein darf!
Eine andere Methode geht über den csv reader, dies ist allerdings umständlich, da ich dann meine erhaltene Liste erst in einen Array und dann die einzelnen Einträge in Float umändern muss....(bei pandas ist das ja so wie ich es verstanden habe auch so):
Vom Prinzip her geht das....Dann könnte ich eben im Nachhinein mir die ersten Werte anschauen und dadurch bestimmen, ob ich eine Datei mit oder ohne Header habe und diese dann mit einer if/else Anweisung weiter verarbeiten...
Meine Frage ist, ob ich das Thema irgendwie anders lösen kann, indem ich davor bestimme, ob die Datei nen Header hat oder nicht und sie dann mit "genfromtxt" auslesen kann. Dies wäre wesentlich komfortabler. Gibt es da was, was ich in der Doku von numpy.genfromtxt übersehen habe?
Meine einzige andere Idee wäre eben über den csv-Reader nur einen Teil auslesen zu lassen und zu bestimmen ob es ne Datei mit oder ohne Header ist und dann entsprechend mit genfromtxt einzulesen (und bei Bedarf den Header überspringen)...Das wäre allerdings eher unelegant und ich könnte auch gleich wie oben einfach einlesen, in array umwandeln, in float umwandeln und natürlich den Header wegschneiden.....
Hat jemand eine elegantere Idee?
Zusammenfassung:
1. Bestimmen ob csv-Datei header hat oder nicht!
2. csv-Datei (bei Bedarf ohne Header) einlesen (am Besten als np.array)
Hat jemand eine andere Idee, wie die von mir genannten?
Vielen Dank für die Unterstützung
ich möchte aus einer .csv-Datei eine Matrix (np.array) lesen und damit dann weiter arbeiten...Problem ist, dass ich manchmal bei den Dateien einen Header habe und manchmal nicht. Ich kann das nicht festlegen und muss es daher abfangen!
Bisher lese ich die Dateien wie folgt aus:
Code: Alles auswählen
datei=genfromtxt("%s"%datei_name, delimiter=',')
Wenn allerdings einen Header in der Datei habe, bekomme ich eine Fehlermeldung....
Mir ist auch völlig klar woher der Fehler kommt...Er liest ja den Header mit nur 2 columns, nach dem Header sind es halt mehr columns und dann kann dies nicht ordentlich in den array geschrieben werden....in genfromtxt
raise ValueError(errmsg)
ValueError: Some errors were detected !
Line #19 (got 100 columns instead of 2)
usw....
Den header kann ich ja wie folgt überspringen (in diesem Fall ist er 18 Zeilen lang):
Code: Alles auswählen
datei=genfromtxt("Test.csv", delimiter=',', skip_header=18)
Eine andere Methode geht über den csv reader, dies ist allerdings umständlich, da ich dann meine erhaltene Liste erst in einen Array und dann die einzelnen Einträge in Float umändern muss....(bei pandas ist das ja so wie ich es verstanden habe auch so):
Code: Alles auswählen
f = open("%s"%bennennung, "r")
reader=csv.reader(f, delimiter=",")
a = list()
for row in reader:
a.append(row)
f.close()
datei = np.array(a)
datei=datei.astype(float)
Meine Frage ist, ob ich das Thema irgendwie anders lösen kann, indem ich davor bestimme, ob die Datei nen Header hat oder nicht und sie dann mit "genfromtxt" auslesen kann. Dies wäre wesentlich komfortabler. Gibt es da was, was ich in der Doku von numpy.genfromtxt übersehen habe?
Meine einzige andere Idee wäre eben über den csv-Reader nur einen Teil auslesen zu lassen und zu bestimmen ob es ne Datei mit oder ohne Header ist und dann entsprechend mit genfromtxt einzulesen (und bei Bedarf den Header überspringen)...Das wäre allerdings eher unelegant und ich könnte auch gleich wie oben einfach einlesen, in array umwandeln, in float umwandeln und natürlich den Header wegschneiden.....
Hat jemand eine elegantere Idee?
Zusammenfassung:
1. Bestimmen ob csv-Datei header hat oder nicht!
2. csv-Datei (bei Bedarf ohne Header) einlesen (am Besten als np.array)
Hat jemand eine andere Idee, wie die von mir genannten?
Vielen Dank für die Unterstützung