Lesen von durch Tabulatoren getrennten Dateien mit Pandas - funktioniert unter Windows, jedoch nicht unter Mac

88

Ich habe eine durch Tabulatoren getrennte Datendatei in Windows mit Pandas / Python ohne Probleme gelesen. Die Datendatei enthält Notizen in den ersten drei Zeilen und folgt mit einer Überschrift.

df = pd.read_csv(myfile,sep='\t',skiprows=(0,1,2),header=(0))

Ich versuche jetzt, diese Datei mit meinem Mac zu lesen. (Ich verwende Python zum ersten Mal auf einem Mac.) Ich erhalte die folgende Fehlermeldung.

pandas.parser.CParserError: Error tokenizing data. C error: Expected 1
fields in line 8, saw 39

Wenn Sie das Argument error_bad_lines für read_csv auf False setzen , erhalte ich die folgenden Informationen, die bis zum Ende der letzten Zeile fortgesetzt werden.

Skipping line 8: expected 1 fields, saw 39
Skipping line 9: expected 1 fields, saw 125
Skipping line 10: expected 1 fields, saw 125
Skipping line 11: expected 1 fields, saw 125
Skipping line 12: expected 1 fields, saw 125
Skipping line 13: expected 1 fields, saw 125
Skipping line 14: expected 1 fields, saw 125
Skipping line 15: expected 1 fields, saw 125
Skipping line 16: expected 1 fields, saw 125
Skipping line 17: expected 1 fields, saw 125
...

Muss ich einen Wert für das Codierungsargument angeben ? Es scheint, als ob ich nicht sollte, weil das Lesen der Datei unter Windows gut funktioniert.

user3062149
quelle
Verwenden Sie auf beiden Betriebssystemen genau dieselbe Version von Pandas? Können Sie einige Beispieldaten bereitstellen, die das Problem auf dem Mac veranschaulichen?
Joris
unabhängig: Verstehst du den Unterschied zwischen: (0)und (0,)in Python? Hinweis: (0)ist 0und (0,)ist 0,- Komma erstellt ein Tupel (außer einem leeren), keine Klammern.
JFS
Hast du es versucht df = pd.read_table(myfile, skiprows=[0,1,2], header=0)?
pbreach
Hallo zusammen. Danke für die Vorschläge. Ich habe eine vorübergehende Lösung erstellt, muss dieses Problem jedoch möglicherweise erneut prüfen und in Zukunft nach einer besseren Lösung suchen. Wenn und wann ich es tue, werde ich Ihren Vorschlag weiter untersuchen. Meine vorübergehende Lösung bestand darin, die CSV-Datei, die ich hatte (und zuvor mithilfe von Excel in die durch problematische Tabulatoren getrennte Datei konvertiert hatte), als .tsv mit Google Docs zu speichern. Ich habe Gdocs nur verwendet, weil es die bequemste Dokumentanwendung war, die mir zu diesem Zeitpunkt zur Verfügung stand. Diese Konvertierung hat funktioniert. Ich glaube, Pandas konnte die Datei korrekt lesen und mit dem Rest meines Codes fortfahren.
user3062149
Ich vermute, das Problem, das Sie hier mit Ihrem Mac sehen, sind Leitungsterminatoren. Auf einem Mac gemacht Tabellen können alle Arten von Spaß Verhalten mit verschiedenen Bibliotheken verursachen, den csv_reader lib in Python
Brad Sanders

Antworten:

137

Der größte Hinweis ist, dass alle Zeilen in einer Zeile zurückgegeben werden. Dies zeigt an, dass Leitungsabschlusszeichen ignoriert werden oder nicht vorhanden sind.

Sie können den Zeilenabschluss für csv_reader angeben. Wenn Sie auf einem Mac arbeiten, enden die erstellten Linien \reher mit dem Linux-Standard \noder besser mit dem Hosenträger- und Gürtelansatz von Windows \r\n.

pandas.read_csv(filename, sep='\t', lineterminator='\r')

Sie können alle Ihre Daten auch mit dem Codecs-Paket öffnen. Dies kann die Robustheit auf Kosten der Dokumentladegeschwindigkeit erhöhen.

import codecs

doc = codecs.open('document','rU','UTF-16') #open for reading with "universal" type set

df = pandas.read_csv(doc, sep='\t')
Brad Sanders
quelle
3
Das Hinzufügen von Codecs hat mir geholfen. Dann wurde mir klar, dass es in read_csv einen Parameter gibt, der dasselbe tut. Ich habe encoding = 'utf-16' hinzugefügt und das Problem wurde für mich behoben.
Mikhail Venkov
2

Eine andere Möglichkeit wäre engine='python', dem Befehl etwas hinzuzufügenpandas.read_csv(filename, sep='\t', engine='python')

user3479780
quelle