Ich versuche, eine CSV-Datei mit Pandas zu bearbeiten, erhalte jedoch folgende Fehlermeldung:
pandas.parser.CParserError: Fehler beim Tokenisieren von Daten. C-Fehler: 2 Felder in Zeile 3 erwartet, Säge 12
Ich habe versucht, die Pandas-Dokumente zu lesen, aber nichts gefunden.
Mein Code ist einfach:
path = 'GOOG Key Ratios.csv'
#print(open(path).read())
data = pd.read_csv(path)
Wie kann ich das beheben? Soll ich das csv
Modul oder eine andere Sprache verwenden?
Datei ist von Morningstar
pandas.to_csv()
auftritt, kann dies daran liegen, dass ein Spaltenname ein '\ r' enthält. In diesem Fall schreibt to_csv () die nachfolgenden Spaltennamen tatsächlich in die erste Spalte des Datenrahmens, was dazu führt ein Unterschied zwischen der Anzahl der Spalten in den ersten X Zeilen. Dieser Unterschied ist eine Ursache für den C-Fehler.pd.read_csv("<path>", sep=";")
. Verwenden Sie Excel nicht zur Überprüfung, da die Daten manchmal standardmäßig in Spalten abgelegt werden und daher das Trennzeichen entfernt wird.Antworten:
du könntest es auch versuchen;
Beachten Sie, dass dadurch die fehlerhaften Zeilen übersprungen werden.
quelle
expected 8 fields, saw 9
?read_csv
. @PetraBarus, warum nicht einfach Spalten zu den fehlenden CSV-Dateien hinzufügen (mit Nullwerten nach Bedarf)?names=["col1", "col2", ...]
der maximalen Anzahl erwarteter Spalten funktioniert ebenfalls. Auf diese Weise habe ich dieses Problem gelöst, als ich darauf gestoßen bin. Siehe: stackoverflow.com/questions/18039057/…Es könnte ein Problem mit sein
Um dies zu lösen, geben Sie beim Aufruf die Argumente
sep
und / oderheader
Argumente anread_csv
. Zum Beispiel,Definiert im obigen Code
sep
Ihr Trennzeichen undheader=None
teilt Pandas mit, dass Ihre Quelldaten keine Zeile für Überschriften / Spaltentitel enthalten. So heißt es in den Dokumenten : "Wenn die Datei keine Kopfzeile enthält, sollten Sie den Kopf = Keine explizit übergeben." In diesem Fall erstellt pandas automatisch Ganzzahlindizes für jedes Feld {0,1,2, ...}.Laut den Dokumenten sollte das Trennzeichen kein Problem sein. In den Dokumenten heißt es: "Wenn sep None [nicht angegeben] ist, wird versucht, dies automatisch zu ermitteln." Ich hatte jedoch kein Glück damit, einschließlich Fällen mit offensichtlichen Trennzeichen.
quelle
Der Parser wird durch den Header der Datei verwirrt. Es liest die erste Zeile und leitet die Anzahl der Spalten aus dieser Zeile ab. Die ersten beiden Zeilen sind jedoch nicht repräsentativ für die tatsächlichen Daten in der Datei.
Probieren Sie es mit
data = pd.read_csv(path, skiprows=2)
quelle
Ihre CSV-Datei hat möglicherweise eine variable Anzahl von Spalten und
read_csv
leitet die Anzahl der Spalten aus den ersten Zeilen ab. Zwei Möglichkeiten, dies in diesem Fall zu lösen:1) Ändern Sie die CSV-Datei so, dass sie eine erste Dummy-Zeile mit der maximalen Anzahl von Spalten enthält (und geben Sie an
header=[0]
).2) Oder verwenden Sie,
names = list(range(0,N))
wobei N die maximale Anzahl von Spalten ist.quelle
Dies ist definitiv ein Problem des Trennzeichens, da die meisten CSV-CSVs mit erstellt werden.
sep='/t'
Versuchen Sie daherread_csv
, das Tabulatorzeichen(\t)
mit einem Trennzeichen zu verwenden/t
. Versuchen Sie daher, mit der folgenden Codezeile zu öffnen.quelle
Ich hatte dieses Problem auch, aber vielleicht aus einem anderen Grund. Ich hatte einige nachgestellte Kommas in meiner CSV, die eine zusätzliche Spalte hinzufügten, die Pandas zu lesen versuchte. Die folgenden Funktionen funktionieren, ignorieren jedoch einfach die fehlerhaften Zeilen:
Wenn Sie die Zeilen hässlich halten möchten, um die Fehler zu behandeln, gehen Sie wie folgt vor:
Ich fuhr fort, ein Skript zu schreiben, um die Zeilen wieder in den DataFrame einzufügen, da die fehlerhaften Zeilen durch die Variable 'line' im obigen Code angegeben werden. Dies alles kann durch einfache Verwendung des CSV-Readers vermieden werden. Hoffentlich können die Pandas-Entwickler es in Zukunft einfacher machen, mit dieser Situation umzugehen.
quelle
Ich hatte dieses Problem, bei dem ich versuchte, eine CSV einzulesen, ohne Spaltennamen einzugeben.
Ich habe die Spaltennamen zuvor in einer Liste angegeben und sie dann übergeben
names
, und es wurde sofort gelöst. Wenn Sie keine Spaltennamen festgelegt haben, können Sie einfach so viele Platzhalternamen erstellen, wie die maximale Anzahl von Spalten in Ihren Daten enthalten sein kann.quelle
Ich hatte dieses Problem selbst ein paar Mal. Fast jedes Mal liegt der Grund darin, dass die Datei, die ich öffnen wollte, zunächst keine ordnungsgemäß gespeicherte CSV war. Und mit "richtig" meine ich, dass jede Zeile die gleiche Anzahl von Trennzeichen oder Spalten hatte.
Normalerweise geschah dies, weil ich die CSV in Excel geöffnet und dann nicht ordnungsgemäß gespeichert hatte. Obwohl die Dateierweiterung immer noch .csv war, wurde das reine CSV-Format geändert.
Jede mit pandas to_csv gespeicherte Datei wird ordnungsgemäß formatiert und sollte dieses Problem nicht haben. Wenn Sie es jedoch mit einem anderen Programm öffnen, kann sich die Struktur ändern.
Ich hoffe, das hilft.
quelle
Ich bin auf das gleiche Problem gestoßen. Die Verwendung
pd.read_table()
derselben Quelldatei schien zu funktionieren. Ich konnte den Grund dafür nicht nachvollziehen, aber es war eine nützliche Problemumgehung für meinen Fall. Vielleicht kann jemand, der besser informiert ist, mehr Licht ins Dunkel bringen, warum es funktioniert hat.Bearbeiten: Ich habe festgestellt, dass dieser Fehler auftritt, wenn Ihre Datei Text enthält, der nicht das gleiche Format wie die tatsächlichen Daten hat. Dies sind normalerweise Kopf- oder Fußzeileninformationen (größer als eine Zeile, daher überspringt skip_header nicht), die nicht durch die gleiche Anzahl von Kommas wie Ihre tatsächlichen Daten getrennt werden (bei Verwendung von read_csv). Bei Verwendung von read_table wird eine Registerkarte als Trennzeichen verwendet, die den aktuellen Fehler des Benutzers umgehen, aber andere einführen kann.
Normalerweise umgehe ich das, indem ich die zusätzlichen Daten in eine Datei lese und dann die Methode read_csv () verwende.
Die genaue Lösung kann je nach Ihrer tatsächlichen Datei unterschiedlich sein, aber dieser Ansatz hat in mehreren Fällen bei mir funktioniert
quelle
Folgendes hat bei mir funktioniert (ich habe diese Antwort gepostet, da ich dieses Problem speziell in einem Google Colaboratory Notebook hatte):
quelle
|
als Trennzeichen für meine CSV-Datei festgelegt habe. Ich versuche lieber zuerst diesen Ansatz, anstatt Zeilen oder schlechte Zeilen zu überspringen.Ich hatte ein ähnliches Problem beim Versuch, eine durch Tabulatoren getrennte Tabelle mit Leerzeichen, Kommas und Anführungszeichen zu lesen:
Dies besagt, dass es etwas mit der C-Parsing-Engine zu tun hat (dies ist die Standardeinstellung). Vielleicht ändert sich etwas, wenn man zu einer Python wechselt
Das ist ein anderer Fehler.
Wenn wir versuchen, Leerzeichen aus der Tabelle zu entfernen, ändert sich der Fehler von Python-Engine erneut:
Und es wird klar, dass Pandas Probleme hatten, unsere Zeilen zu analysieren. Um eine Tabelle mit Python Engine zu analysieren, musste ich vorher alle Leerzeichen und Anführungszeichen aus der Tabelle entfernen. In der Zwischenzeit stürzte die C-Engine auch mit Kommas in Reihen ab.
Um zu vermeiden, dass eine neue Datei mit Ersetzungen erstellt wird, habe ich dies getan, da meine Tabellen klein sind:
tl; dr
Ändern Sie die Parsing-Engine und vermeiden Sie nicht abgrenzende Anführungszeichen / Kommas / Leerzeichen in Ihren Daten.
quelle
Der Datensatz, den ich verwendet habe, hatte viele Anführungszeichen ("), die außerhalb der Formatierung verwendet wurden. Ich konnte den Fehler beheben, indem ich diesen Parameter für Folgendes einfügte
read_csv()
:quelle
Verwenden Sie das Trennzeichen im Parameter
Es wird lesen.
quelle
Obwohl dies bei dieser Frage nicht der Fall ist, kann dieser Fehler auch bei komprimierten Daten auftreten. Das explizite Festlegen des Werts für das
kwarg
compression
Problem wurde behoben.quelle
Eine Alternative, die sich bei ähnlichen Parsing-Fehlern als nützlich erwiesen hat, verwendet das CSV-Modul, um Daten in einen Pandas df umzuleiten. Zum Beispiel:
Ich finde das CSV-Modul etwas robuster gegenüber schlecht formatierten, durch Kommas getrennten Dateien und hatte daher Erfolg mit dieser Route, um Probleme wie diese zu beheben.
quelle
Die folgende Befehlsfolge funktioniert (ich verliere die erste Zeile der Daten - kein Header = Keine vorhanden -, aber zumindest wird sie geladen):
df = pd.read_csv(filename, usecols=range(0, 42)) df.columns = ['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND', 'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS', 'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2', 'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6', 'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10', 'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14']
Folgendes funktioniert NICHT:
df = pd.read_csv(filename, names=['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND', 'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS', 'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2', 'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6', 'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10', 'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14'], usecols=range(0, 42))
CParserError: Fehler beim Tokenisieren von Daten. C-Fehler: 53 Felder in Zeile 1605634, Säge 54 erwartet. Folgendes funktioniert NICHT:
df = pd.read_csv(filename, header=None)
CParserError: Fehler beim Tokenisieren von Daten. C-Fehler: 53 Felder in Zeile 1605634 erwartet, 54 gesehen
Daher müssen Sie in Ihrem Problem bestehen
usecols=range(0, 2)
quelle
Für diejenigen, die ähnliche Probleme mit Python 3 unter Linux haben.
Versuchen:
quelle
Manchmal liegt das Problem nicht in der Verwendung von Python, sondern in den Rohdaten.
Ich habe diese Fehlermeldung erhalten
Es stellte sich heraus, dass in der Spaltenbeschreibung manchmal Kommas standen. Dies bedeutet, dass die CSV-Datei bereinigt oder ein anderes Trennzeichen verwendet werden muss.
quelle
verwenden
pandas.read_csv('CSVFILENAME',header=None,sep=', ')
beim Versuch, CSV-Daten vom Link zu lesen
http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data
Ich habe die Daten von der Site in meine CSV-Datei kopiert. Es hatte zusätzliche Leerzeichen, also benutzte sep = ',' und es funktionierte :)
quelle
Ich hatte einen Datensatz mit bereits vorhandenen Zeilennummern. Ich habe index_col verwendet:
quelle
Das habe ich getan.
sep='::'
löste mein Problem:quelle
Ich hatte einen ähnlichen Fall wie diesen und Einstellung
hat funktioniert
quelle
Ich habe das gleiche Problem, wenn read_csv: ParserError: Fehler beim Tokenisieren von Daten. Ich habe gerade die alte CSV-Datei in einer neuen CSV-Datei gespeichert. Das Problem ist behoben!
quelle
Das Problem für mich war, dass eine neue Spalte an meinen CSV- Intraday angehängt wurde . Die akzeptierte Antwortlösung würde nicht funktionieren, da jede zukünftige Zeile verworfen würde, wenn ich sie verwenden würde
error_bad_lines=False
.Die Lösung in diesem Fall bestand darin, den Parameter usecols in zu verwenden
pd.read_csv()
. Auf diese Weise kann ich nur die Spalten angeben, die ich in die CSV einlesen muss, und mein Python-Code bleibt gegenüber zukünftigen CSV-Änderungen stabil, solange eine Kopfzeile vorhanden ist (und sich die Spaltennamen nicht ändern).Beispiel
Ein weiterer Vorteil davon ist, dass ich viel weniger Daten in den Speicher laden kann, wenn ich nur 3-4 Spalten einer CSV mit 18-20 Spalten verwende.
quelle
Einfache Lösung : Öffnen Sie die CSV-Datei in Excel und speichern Sie sie unter einer anderen Namensdatei im CSV-Format. Versuchen Sie erneut, es als Spyder zu importieren. Ihr Problem ist behoben!
quelle
Ich habe diesen Fehler mit einem streunenden Anführungszeichen festgestellt. Ich verwende eine Zuordnungssoftware, die beim Exportieren von durch Kommas getrennten Dateien Anführungszeichen um Textelemente setzt. Text, der Anführungszeichen verwendet (z. B. '= Fuß und "= Zoll), kann problematisch sein, wenn dann Begrenzerkollisionen auftreten. Betrachten Sie dieses Beispiel, in dem festgestellt wird, dass ein 5-Zoll-Well-Log-Druck schlecht ist:
UWI_key,Latitude,Longitude,Remark US42051316890000,30.4386484,-96.4330734,"poor 5""
Die Verwendung
5"
als Abkürzung für5 inch
wirft am Ende einen Schraubenschlüssel in die Werke. Excel entfernt einfach das zusätzliche Anführungszeichen, aber Pandas bricht ohne daserror_bad_lines=False
oben erwähnte Argument zusammen.quelle
Soweit ich das beurteilen kann und nachdem Sie sich Ihre Datei angesehen haben, besteht das Problem darin, dass die CSV-Datei, die Sie laden möchten, mehrere Tabellen enthält. Es gibt leere Zeilen oder Zeilen, die Tabellentitel enthalten. Versuchen Sie, sich diese Stackoverflow-Antwort anzusehen . Es zeigt, wie dies programmatisch erreicht werden kann.
Ein anderer dynamischer Ansatz, um dies zu tun, wäre, das CSV-Modul zu verwenden , jede einzelne Zeile gleichzeitig zu lesen und Sanitätsprüfungen / reguläre Ausdrücke durchzuführen, um zu schließen, ob die Zeile (Titel / Header / Werte / Leerzeichen) ist. Mit diesem Ansatz haben Sie einen weiteren Vorteil: Sie können Ihre Daten nach Bedarf in Python-Objekten aufteilen / anhängen / sammeln.
Am einfachsten wäre es, die Pandas-Funktion zu verwenden,
pd.read_clipboard()
nachdem Sie die Tabelle manuell ausgewählt und in die Zwischenablage kopiert haben, falls Sie die CSV in Excel oder so etwas öffnen können.Irrelevant :
Darüber hinaus irrelevant für Ihr Problem, aber weil dies niemand erwähnt hat : Ich hatte das gleiche Problem beim Laden einiger Datensätze, z. B.
seeds_dataset.txt
von UCI. In meinem Fall trat der Fehler auf, weil einige Trennzeichen mehr Leerzeichen als eine echte Registerkarte hatten\t
. Siehe zum Beispiel Zeile 3 im FolgendenVerwenden Sie daher
\t+
im Trennzeichenmuster anstelle von\t
.quelle
In meinem Fall liegt dies daran, dass sich das Format der ersten und letzten beiden Zeilen der CSV-Datei vom mittleren Inhalt der Datei unterscheidet.
Ich öffne also die CSV-Datei als Zeichenfolge, analysiere den Inhalt der Zeichenfolge und
read_csv
erhalte dann einen Datenrahmen.quelle
In meinem Fall war das Trennzeichen nicht die Standardeinstellung ",", sondern Tab.
Hinweis: "\ t" funktionierte nicht wie von einigen Quellen vorgeschlagen. "\\ t" war erforderlich.
quelle
Ich hatte einen ähnlichen Fehler und das Problem war, dass ich einige Escape-Anführungszeichen in meiner CSV-Datei hatte und den Escapeechar-Parameter entsprechend einstellen musste.
quelle