wake-up-neo.com

Python Pandas Fehler beim Tokenisieren von Daten

Ich versuche, Pandas zu verwenden, um eine CSV-Datei zu bearbeiten, aber ich erhalte diesen Fehler:

pandas.parser.CParserError: Fehler beim tokenisieren von Daten. C-Fehler: Erwartet 2 Felder in Zeile 3, 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 Modul csv oder eine andere Sprache verwenden?

Datei ist von Morningstar

207
abuteau

du könntest es auch versuchen;

data = pd.read_csv('file1.csv', error_bad_lines=False)
315
richie

Der Parser wird durch den Header der Datei verwirrt. Es liest die erste Zeile und zieht die Anzahl der Spalten aus dieser Zeile. Die ersten beiden Zeilen sind jedoch nicht repräsentativ für die tatsächlichen Daten in der Datei.

Versuchen Sie es mit data = pd.read_csv(path, skiprows=2)

29
TomAugspurger

Ihre CSV-Datei verfügt möglicherweise über eine variable Spaltenanzahl und read_csv hat die Anzahl der Spalten aus den ersten Zeilen abgeleitet. Zwei Möglichkeiten, um es in diesem Fall zu lösen:

1) Ändern Sie die CSV-Datei in eine erste Dummy-Zeile mit maximaler Spaltenanzahl (und geben Sie header=[0] an).

2) Oder verwenden Sie names = list(range(0,N)), wobei N die maximale Spaltenanzahl ist.

23
computerist

Ich hatte dieses Problem auch, aber vielleicht aus einem anderen Grund. Ich hatte in meinem CSV nachgestellte Kommas, die eine zusätzliche Spalte hinzufügten, die Pandas zu lesen versuchten. Mit den folgenden Funktionen werden die fehlerhaften Zeilen ignoriert:

data = pd.read_csv('file1.csv', error_bad_lines=False)

Wenn Sie die Zeilen als hässlichen Hack für die Fehlerbehandlung verwenden möchten, gehen Sie wie folgt vor:

line     = []
expected = []
saw      = []     
cont     = True 

while cont == True:     
    try:
        data = pd.read_csv('file1.csv',skiprows=line)
        cont = False
    except Exception as e:    
        errortype = e.message.split('.')[0].strip()                                
        if errortype == 'Error tokenizing data':                        
           cerror      = e.message.split(':')[1].strip().replace(',','')
           nums        = [n for n in cerror.split(' ') if str.isdigit(n)]
           expected.append(int(nums[0]))
           saw.append(int(nums[2]))
           line.append(int(nums[1])-1)
         else:
           cerror      = 'Unknown'
           print 'Unknown Error - 222'

if line != []:
    # Handle the errors however you want

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 kann alles vermieden werden, indem Sie einfach den CSV-Reader verwenden. Hoffentlich können die Pandas-Entwickler es in Zukunft leichter machen, mit dieser Situation umzugehen.

15
Robert Geiger

Dies ist definitiv ein Problem des Trennzeichens, da die meisten CSV-CSVs mit sep='/t' erstellt werden. Versuchen Sie also, read_csv mit dem Tabulatorzeichen (\t) mit dem Trennzeichen /t zu erstellen. Versuchen Sie also, die folgende Codezeile zu verwenden.

data=pd.read_csv("File_path", sep='\t')
14

Ich habe dieses Problem schon ein paar Mal gehabt. Der Grund ist fast immer, dass die Datei, die ich öffnen wollte, anfangs keine ordnungsgemäß gespeicherte CSV-Datei war. Mit "richtig" meine ich, dass jede Zeile die gleiche Anzahl von Trennzeichen oder Spalten hatte. 

Normalerweise passierte es, weil ich die CSV-Datei in Excel geöffnet und dann falsch 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, ändert sich möglicherweise die Struktur. 

Hoffentlich hilft das. 

9
elPastor

Ich bin auf das gleiche Problem gestoßen. Die Verwendung von pd.read_table() in derselben Quelldatei schien zu funktionieren. Ich konnte den Grund dafür nicht ermitteln, aber es war eine nützliche Lösung für meinen Fall. Vielleicht kann jemand mit mehr Wissen mehr herausfinden, warum es funktioniert.

Bearbeiten: Ich habe festgestellt, dass dieser Fehler auftritt, wenn Sie Text in Ihrer Datei haben, der nicht das gleiche Format wie die eigentlichen Daten hat. Dies sind normalerweise Kopf- oder Fußzeileninformationen (mehr als eine Zeile, daher funktioniert skip_header nicht), die nicht durch die gleiche Anzahl von Kommas getrennt werden wie Ihre tatsächlichen Daten (bei Verwendung von read_csv). Bei der Verwendung von read_table wird ein Tab als Trennzeichen verwendet, der den aktuellen Fehler des Benutzers umgehen und andere einführen kann.

Normalerweise komme ich dazu um, indem ich die zusätzlichen Daten in eine Datei einliesse und dann die read_csv () -Methode verwende.

Die genaue Lösung kann sich abhängig von Ihrer tatsächlichen Datei unterscheiden, aber dieser Ansatz hat in mehreren Fällen für mich funktioniert

7
Legend_Ari

Beim Versuch, eine tabulatorgetrennte Tabelle mit Leerzeichen, Kommas und Anführungszeichen zu lesen, hatte ich ein ähnliches Problem:

1115794 4218    "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", ""
1144102 3180    "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", "g__Bacillus", ""
368444  2328    "k__Bacteria", "p__Bacteroidetes", "c__Bacteroidia", "o__Bacteroidales", "f__Bacteroidaceae", "g__Bacteroides", ""



import pandas as pd
# Same error for read_table
counts = pd.read_csv(path_counts, sep='\t', index_col=2, header=None, engine = 'c')

pandas.io.common.CParserError: Error tokenizing data. C error: out of memory

Dies besagt, dass es etwas mit der C-Parsing-Engine (die Standard-Engine) zu tun hat. Wenn man zu einem Python wechselt, wird sich vielleicht etwas ändern 

counts = pd.read_table(path_counts, sep='\t', index_col=2, header=None, engine='python')

Segmentation fault (core dumped)

Das ist jetzt ein anderer Fehler.
Wenn wir fortfahren und versuchen, Leerzeichen aus der Tabelle zu entfernen, ändert sich der Fehler der Python-Engine erneut:

1115794 4218    "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae",""
1144102 3180    "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae","g__Bacillus",""
368444  2328    "k__Bacteria","p__Bacteroidetes","c__Bacteroidia","o__Bacteroidales","f__Bacteroidaceae","g__Bacteroides",""


_csv.Error: '   ' expected after '"'

Und es wird deutlich, dass Pandas Probleme hatten, unsere Reihen zu analysieren. Um eine Tabelle mit der Python-Engine zu analysieren, musste ich zuvor alle Leerzeichen und Anführungszeichen aus der Tabelle entfernen. In der Zwischenzeit stürzte die C-Engine auch bei Kommas in Reihen .

Um zu vermeiden, dass eine neue Datei mit Ersetzungen erstellt wird, habe ich dies getan, da meine Tabellen klein sind:

from io import StringIO
with open(path_counts) as f:
    input = StringIO(f.read().replace('", ""', '').replace('"', '').replace(', ', ',').replace('\0',''))
    counts = pd.read_table(input, sep='\t', index_col=2, header=None, engine='python')

tl; dr
Ändern Sie das Parsing-Modul. Vermeiden Sie nicht begrenzende Anführungszeichen/Kommas/Leerzeichen in Ihren Daten.

4
lotrus28

folgende Befehlssequenz funktioniert (ich verliere die erste Zeile der Daten -no header = None present-, aber es lädt zumindest)

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: In Zeile 1605634 wurden 53 Felder erwartet, sah 54 Folgendes funktioniert NICHT:

df = pd.read_csv(filename, header=None)

CParserError: Fehler beim tokenisieren von Daten. C-Fehler: In Zeile 1605634 wurden 53 Felder erwartet, Säge 54

Daher müssen Sie in Ihrem Problem usecols=range(0, 2) passieren

3
kepy97

Obwohl dies für diese Frage nicht der Fall ist, kann dieser Fehler auch bei komprimierten Daten auftreten. Das explizite Einstellen des Werts für kwargcompression hat mein Problem behoben.

result = pandas.read_csv(data_source, compression='gzip')

Trennzeichen im Parameter verwenden 

pd.read_csv(filename, delimiter=",", encoding='utf-8')

Es wird lesen. 

2
Bhavesh Kumar

Der von mir verwendete Datensatz enthielt viele Anführungszeichen ("), die außerhalb der Formatierung verwendet wurden. Ich konnte den Fehler beheben, indem ich diesen Parameter für read_csv() einfügte:

quoting=3 # 3 correlates to csv.QUOTE_NONE for pandas
2
user3426943

Eine Alternative, die ich beim Umgang mit ähnlichen Analysefehlern als nützlich befunden habe, verwendet das CSV-Modul zum Umleiten von Daten in Pandas df. Zum Beispiel:

import csv
import pandas as pd
path = 'C:/FileLocation/'
file = 'filename.csv'
f = open(path+file,'rt')
reader = csv.reader(f)

#once contents are available, I then put them in a list
csv_list = []
for l in reader:
    csv_list.append(l)
f.close()
#now pandas has no problem getting into a df
df = pd.DataFrame(csv_list)

Ich finde, dass das CSV-Modul gegenüber schlecht formatierten, durch Kommas getrennten Dateien etwas robuster ist, und hatte daher mit diesem Weg Erfolg, um Probleme wie diese zu lösen.

2
bcoz

verwenden Sie pandas.read_csv('CSVFILENAME',header=None,sep=', ')

beim Versuch, CSV-Daten aus dem 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 extra Leerzeichen, also sep = ',' und es hat funktioniert :)

2
Abhishek

Manchmal ist das Problem nicht die Verwendung von Python, sondern die Rohdaten.
Ich habe diese Fehlermeldung erhalten 

Error tokenizing data. C error: Expected 18 fields in line 72, saw 19.

Es stellte sich heraus, dass es in der Spaltenbeschreibung manchmal Kommata gab. Dies bedeutet, dass die CSV-Datei bereinigt oder ein anderes Trennzeichen verwendet werden muss. 

2
Kims Sifers

Ich habe das gleiche Problem, wenn read_csv: ParserError: Fehler beim Token von Daten. Ich habe die alte CSV-Datei in einer neuen CSV-Datei gespeichert. Das Problem ist gelöst!

1
Simin Zuo

Ich hatte einen ähnlichen Fall wie dieser und diese Einstellung

train = pd.read_csv('input.csv' , encoding='latin1',engine='python') 

hat funktioniert

1
Adewole Adesola

Ich hatte dieses Problem, bei dem ich versuchte, eine CSV einzulesen, ohne Spaltennamen zu übergeben.

df = pd.read_csv(filename, header=None)

Ich habe die Spaltennamen zuvor in einer Liste angegeben und dann in names übergeben, und das Problem wurde sofort gelöst. Wenn Sie keine Spaltennamen festgelegt haben, können Sie einfach so viele Platzhalternamen wie die maximale Anzahl von Spalten in Ihren Daten erstellen.

col_names = ["col1", "col2", "col3", ...]
df = pd.read_csv(filename, names=col_names)
1
Steven Rouk

Das habe ich getan.

sep='::' hat mein Problem gelöst: 

data=pd.read_csv('C:\\Users\\HP\\Downloads\\NPL ASSINGMENT 2 imdb_labelled\\imdb_labelled.txt',engine='python',header=None,sep='::')
1

Ich hatte einen Datensatz mit bereits vorhandenen Zeilennummern, ich verwendete index_col: 

pd.read_csv('train.csv', index_col=0)
1
spicyramen

Das Problem könnte bei Dateiproblemen liegen. In meinem Fall wurde das Problem nach dem Umbenennen der Datei behoben. den Grund noch nicht herauszufinden ..

0
SQA_LEARN

Die meisten nützlichen Antworten sind bereits erwähnt, ich empfehle jedoch, die pandas -Datenrahmen als Parkettdatei zu speichern. Parkettfeilen haben dieses Problem nicht und sind gleichzeitig speichereffizient.

0
Bikash Joshi

Sie können diesen Schritt ausführen, um das Problem zu vermeiden. 

train = pd.read_csv('/home/Project/output.csv' , header=None)

einfach hinzufügen - header=None

Hoffe das hilft!!

0
rahul ranjan

Ich bin auf diesen Fehler mit einem Anführungszeichen gestoßen. Ich verwende eine Mapping-Software, die beim Exportieren von durch Kommas getrennten Dateien Textelemente in Anführungszeichen setzt. Text, der Anführungszeichen verwendet (z. B. '= Fuß und "= Zoll), kann problematisch sein. Betrachten Sie dieses Beispiel, das feststellt, dass ein 5-Zoll-Well-Log-Druck schlecht ist:

UWI_key,Latitude,Longitude,Remark US42051316890000,30.4386484,-96.4330734,"poor 5""

Die Verwendung von 5" als Abkürzung für 5 inch führt dazu, dass ein Schlüssel in die Werke geworfen wird. Excel entfernt einfach das zusätzliche Anführungszeichen, aber Pandas bricht ohne das oben erwähnte Argument error_bad_lines=False zusammen.

0
Andrew Silver

Ich hatte einen ähnlichen Fehler und das Problem war, dass ich in meiner csv-Datei einige Anführungszeichen hatte und den Parameter escapechar entsprechend einstellen musste. 

0
jvvw

Folgendes hat bei mir funktioniert (ich habe diese Antwort gepostet, da ich dieses Problem speziell in einem Google Colaboratory-Notizbuch hatte):

df = pd.read_csv("/path/foo.csv", delimiter=';', skiprows=0, low_memory=False)
0
Dirk

Ich bin auf diesen Fehler mit einem Anführungszeichen gestoßen. Ich verwende eine Mapping-Software, die beim Exportieren von durch Kommas getrennten Dateien Textelemente in Anführungszeichen setzt. Text, der Anführungszeichen verwendet (z. B. '= Fuß und "= Zoll), kann problematisch sein. Betrachten Sie dieses Beispiel, das feststellt, dass ein 5-Zoll-Well-Log-Druck schlecht ist:

UWI_key,Latitude,Longitude,Remark US42051316890000,30.4386484,-96.4330734,"poor 5""

Die Verwendung von 5" als Abkürzung für 5 inch führt dazu, dass ein Schlüssel in die Werke geworfen wird. Excel entfernt einfach das zusätzliche Anführungszeichen, aber Pandas bricht ohne das oben erwähnte Argument error_bad_lines=False zusammen.

Sobald Sie die Art Ihres Fehlers kennen, ist es möglicherweise am einfachsten, vor dem Importieren in einem Texteditor (z. B. Sublime Text 3 oder Notepad ++) eine Suche nach Ersatz durchzuführen.

0
Andrew Silver

Das Problem für mich war, dass eine neue Spalte an meine CSV Intraday angehängt wurde. Die akzeptierte Antwortlösung würde nicht funktionieren, da jede zukünftige Zeile gelöscht würde, wenn ich error_bad_lines=False verwende. 

Die Lösung in diesem Fall war die Verwendung des Parameters usecols in pd.read_csv(). Auf diese Weise kann ich nur die Spalten angeben, die ich in die CSV einlesen muss, und mein Python-Code bleibt für zukünftige CSV-Änderungen stabil, solange eine Kopfspalte vorhanden ist (und die Spaltennamen nicht geändert werden). 

usecols : list-like or callable, optional 

Return a subset of the columns. If list-like, all elements must either
be positional (i.e. integer indices into the document columns) or
strings that correspond to column names provided either by the user in
names or inferred from the document header row(s). For example, a
valid list-like usecols parameter would be [0, 1, 2] or ['foo', 'bar',
'baz']. Element order is ignored, so usecols=[0, 1] is the same as [1,
0]. To instantiate a DataFrame from data with element order preserved
use pd.read_csv(data, usecols=['foo', 'bar'])[['foo', 'bar']] for
columns in ['foo', 'bar'] order or pd.read_csv(data, usecols=['foo',
'bar'])[['bar', 'foo']] for ['bar', 'foo'] order.

Beispiel

my_columns = ['foo', 'bar', 'bob']
df = pd.read_csv(file_path, usecols=my_columns)

Ein weiterer Vorteil ist, dass ich viel weniger Daten in den Speicher laden kann, wenn ich nur 3-4 Spalten eines CSV mit 18-20 Spalten verwende. 

0
Scott Skiles