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.
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
undusecols
. 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
Hilfreichster Kommentar
Versuche dies: