Pandas: read_csv "CParserError: Fehler beim Tokenisieren von Daten" mit variabler Anzahl von Feldern

Erstellt am 31. Okt. 2015  ·  17Kommentare  ·  Quelle: pandas-dev/pandas

Ich habe Probleme mit read_csv (Pandas 0.17.0), wenn ich versuche, eine über 380 MB große CSV-Datei zu lesen. Die Datei beginnt mit 54 Feldern, aber einige Zeilen haben 53 Felder anstelle von 54. Das Ausführen des folgenden Codes gibt mir den folgenden Fehler:

parser = lambda x: datetime.strptime(x, '%y %m %d %H %M %S %f')
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),
                        parse_dates={"TIMESTAMP": [0, 1, 2, 3, 4, 5, 6]},
                        date_parser=parser,
                        header=None)

Error:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

Wenn ich das Schlüsselwort error_bad_lines=False , werden problematische Zeilen ähnlich wie im folgenden Beispiel angezeigt:

Skipping line 1683401: expected 53 fields, saw 54

Diesmal erhalte ich jedoch den folgenden Fehler (auch der DataFrame wird nicht geladen):

CParserError: Too many columns specified: expected 54 and found 53

Wenn ich das Schlüsselwort engine='python' , werden keine Fehler angezeigt, aber das Analysieren der Daten dauert sehr lange. Bitte beachten Sie, dass 53 und 54 in den Fehlermeldungen umgeschaltet werden, je nachdem, ob error_bad_lines=False verwendet wird oder nicht.

IO CSV Usage Question

Hilfreichster Kommentar

Versuche dies:

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

Alle 17 Kommentare

Diese Fehler sind alle korrekt. Sie beschränken die Aktionen des Parsers, indem Sie usecols und names . Tun Sie dies nicht und sehen Sie, ob Sie es analysieren können.

Es ist sehr schwer, so etwas ohne ein Beispiel der reproduzierten Datei zu diagnostizieren.

Zeigen Sie auch pd.show_versions()

Mit der Originaldatendatei:

pd.read_csv(filename) ohne andere Schlüsselwörter scheint die Daten ohne Fehler zu analysieren. pd.read_csv(filename, header=None) gibt den folgenden Fehler aus:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

Völlig einverstanden, dass es ohne die Probendaten sehr schwer zu diagnostizieren ist. Ich habe versucht, den Fehler mit einer CSV-Datei mit ein paar Zeilen zu generieren (einige haben 53 Felder, andere 54). pd.read_csv füllt die Lücken wie erwartet mit NaNs. Ich wiederholte, indem ich usecols und header=None übergab, funktioniert immer noch. Es scheint, dass die Originaldatei ein Problem aufweist, das alle Fehler aufwirft.

pd.show_versions() Ausgabe wie folgt:

INSTALLED VERSIONS
------------------
commit: None
python: 2.7.10.final.0
python-bits: 64
OS: Windows
OS-release: 7
machine: AMD64
processor: Intel64 Family 6 Model 58 Stepping 9, GenuineIntel
byteorder: little
LC_ALL: None
LANG: None

pandas: 0.17.0
nose: 1.3.7
pip: 7.1.2
setuptools: 18.4
Cython: 0.22.1
numpy: 1.10.1
scipy: 0.16.0
statsmodels: 0.6.1
IPython: 3.2.0
sphinx: 1.3.1
patsy: 0.3.0
dateutil: 2.4.2
pytz: 2015.6
blosc: None
bottleneck: 1.0.0
tables: 3.2.0
numexpr: 2.4.3
matplotlib: 1.4.3
openpyxl: 1.8.5
xlrd: 0.9.3
xlwt: 1.0.0
xlsxwriter: 0.7.3
lxml: 3.4.4
bs4: 4.3.2
html5lib: None
httplib2: None
apiclient: None
sqlalchemy: 1.0.5
pymysql: None
psycopg2: None
pd.read_csv(filename, header=None) gives the following error:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

wird erwartet, da die Anzahl der Spalten aus der ersten Zeile abgeleitet wird. Wenn Sie names wird dies als bestimmendes Merkmal verwendet.

Probieren Sie also verschiedene Optionen aus. Sie beschränken es tatsächlich ein bisschen stark mit names und usecols . Vielleicht ist es besser, es einzulesen und dann neu zu indizieren, was Sie brauchen.

Wenn engine='python' verwendet wird, wird der DataFrame seltsamerweise ohne Probleme geladen. Ich habe das folgende Snippet verwendet, um die ersten 3 Zeilen in der Datei und 3 der fehlerhaften Zeilen zu extrahieren (habe die Zeilennummern aus der Fehlermeldung erhalten).

from csv import reader
N = int(input('What line do you need? > '))
with open(filename) as f:
    print(next((x for i, x in enumerate(reader(f)) if i == N), None))

Zeilen 1-3:

['08', '8', '7', '5', '0', '12', '54', '0', '11', '1', '58', '9', '68', '48.2', '0.756', '11.6', '17.5', '13.3', '4.3', '11.3', '32.2', '6.4', '4.1', '5.6', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['08', '8', '7', '5', '0', '15', '80', '0', '11', '1', '62', '9', '69', '77.8', '3.267', '11.2', '17.7', '14.8', '4.2', '15.2', '29.1', '18.4', '10.0', '18.1', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['08', '8', '7', '5', '0', '21', '52', '0', '11', '1', '61', '11', '51', '29.4', '0.076', '4.1', '13.8', '8.3', '21.5', '5.3', '3.1', '5.7', '3.0', '6.1', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']

Beleidigende Zeilen:

['09', '9', '15', '22', '46', '9', '51', '0', '11', '1', '57', '9', '70', '36.3', '0.242', '11.8', '16.2', '6.4', '4.1', '5.8', '31.3', '5.5', '3.9', '6.8', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['09', '9', '15', '22', '46', '25', '31', '0', '11', '1', '70', '9', '73', '67.8', '2.196', '10.4', '17.0', '13.4', '4.4', '12.2', '31.8', '15.6', '4.2', '16.2', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['09', '9', '15', '22', '46', '28', '41', '0', '11', '1', '70', '5', '22', '7.4', '0.003', '4.0', '13.1', '3.4', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']

Wie Sie vorgeschlagen haben, werde ich versuchen, die Datei zu lesen, dann den DataFrame zu ändern (Spalten umbenennen, unnötige löschen usw.) oder einfach die python Engine verwenden (lange Verarbeitungszeit).

Bei weiteren Untersuchungen funktioniert die folgende Befehlsfolge (ich verliere die erste Zeile der Daten - keine header=None vorhanden-, aber sie wird zumindest 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: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

Folgendes funktioniert NICHT :

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

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

Schließen als Nutzungsfrage.

dic_df = _create_init_dic ("C: / Users / swati / Downloads / VQA-Med 2018-Datensatz / c5e905f7-6eb0-4a98-b284-da0729a1caf3_VQAMed2018Train / VQAMed2018Train / VQAMed2018Train-QA.cs")
ParserError: Fehler beim Tokenisieren von Daten. C-Fehler: Erwartet 1 Felder in Zeile 33, Säge 3

Versuche dies:

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

Versuchte es und arbeitete für einen ähnlichen Fehler danke!

Versuchen Sie, beim Lesen quoting=3 hinzuzufügen

Gibt es eine Möglichkeit für Pandas, die zusätzlichen Felder in einer Zeile mit mehr Feldern einfach zu ignorieren?
zum Beispiel für den Fall "53 Felder in Zeile 1605634 erwartet, 54 gesehen"
Es wird einfach Feld 54 in Zeile 1605634 abgelegt

Ein anderer Fall! aber mit "error_bad_lines = False" behoben, gibt es immer noch den Fehler aus, aber 'Exit Code 0'

Ich habe den gleichen Fehler bekommen

Ich füge nur den Begrenzerparameter im read_csv-Modus hinzu

und es hat funktioniert

error_bad_lines = False
Es klappt

pd.read_csv(filename, header=None) gives the following error:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

wird erwartet, da die Anzahl der Spalten aus der ersten Zeile abgeleitet wird. Wenn Sie names wird dies als bestimmendes Merkmal verwendet.

Probieren Sie also verschiedene Optionen aus. Sie beschränken es tatsächlich ein bisschen stark mit names und usecols . Vielleicht ist es besser, es einzulesen und dann neu zu indizieren, was Sie brauchen.

Das funktioniert! Ich schreibe CSV in R-Sprache und versuche, es in Python zu lesen. Die erste Zeile sollte die maximale Länge für alle Zeilen haben. Auf diese Weise wird das Problem fehlerhafter Leitungen behoben und es werden keine Leitungen verloren.

Wenn Sie versuchen, eine XLSX-Datei mit dem Befehl pd.read_csv zu importieren, wird dieser Fehler angezeigt.

Versuchen Sie es mit pd.read_excel anstelle von pd.read_csv

Der einfachste Weg, dies zu beheben, besteht darin, Ihre CSV-Datei in eine Excel-Datei umzuwandeln und pd.read_excel anstelle von pd.read_csv zum Lesen der Daten zu verwenden

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen