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
du könntest es auch versuchen;
data = pd.read_csv('file1.csv', error_bad_lines=False)
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)
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.
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.
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')
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.
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
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.
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
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 kwarg
compression
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.
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
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.
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 :)
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.
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!
Ich hatte einen ähnlichen Fall wie dieser und diese Einstellung
train = pd.read_csv('input.csv' , encoding='latin1',engine='python')
hat funktioniert
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)
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='::')
Ich hatte einen Datensatz mit bereits vorhandenen Zeilennummern, ich verwendete index_col:
pd.read_csv('train.csv', index_col=0)
Das Problem könnte bei Dateiproblemen liegen. In meinem Fall wurde das Problem nach dem Umbenennen der Datei behoben. den Grund noch nicht herauszufinden ..
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.
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!!
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.
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.
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)
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.
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.
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.