Python Pandas Fehler beim Tokenisieren von Daten

341

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 csvModul oder eine andere Sprache verwenden?

Datei ist von Morningstar

Abuteau
quelle
10
Wenn dieser Fehler beim Lesen einer von geschriebenen Datei 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.
user0
8
Manchmal hilft es, nur den Parameter "sep" explizit anzugeben. Scheint ein Parser-Problem zu sein.
Gilgamash
2
Dieser Fehler kann auch auftreten, wenn Sie ein Komma als Trennzeichen verwenden und mehr Kommas als erwartet haben (mehr Felder in der Fehlerzeile als in der Kopfzeile definiert). Sie müssen also entweder das zusätzliche Feld oder das zusätzliche Komma entfernen, wenn es versehentlich vorhanden ist. Sie können dies manuell beheben und müssen dann die Fehlerzeilen nicht überspringen.
Tsveti_iko
2
Kommentar von Gilgamash hat mir geholfen. Öffnen Sie die CSV-Datei in einem Texteditor (wie dem Windows-Editor oder Notepad ++), um festzustellen, welches Zeichen für die Trennung verwendet wird. Wenn es ein Semikolon ist, versuchen Sie es 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.
Julian
In Bezug auf den Kommentar von @gilgamash - dies hat mich in die richtige Richtung geschickt, aber in meinem Fall wurde es gelöst, indem der Parameter "sep" explizit nicht angegeben wurde.
TheLoneDeranger

Antworten:

514

du könntest es auch versuchen;

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

Beachten Sie, dass dadurch die fehlerhaften Zeilen übersprungen werden.

Richie
quelle
151
Beachten Sie, dass bei Verwendung von error_bad_lines = False die fehlerhaften Zeilen übersprungen werden.
Biobirdman
10
Gibt es eine Möglichkeit, fehlende Spalten in Zeilen zu füllen, die so etwas wie ausgeben expected 8 fields, saw 9?
Petra Barus
26
Die bessere Lösung besteht darin, die fehlerhafte Datei zu untersuchen und die fehlerhaften Zeilen so zu korrigieren, dass sie von gelesen werden können read_csv. @PetraBarus, warum nicht einfach Spalten zu den fehlenden CSV-Dateien hinzufügen (mit Nullwerten nach Bedarf)?
Dbliss
4
Ja, das habe ich gerade gemacht. Es ist viel einfacher, Spalten hinzuzufügen. Das Öffnen von CSV in einer Tabelle führt dies aus.
Petra Barus
5
Das Übergeben 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/…
Steven Rouk
99

Es könnte ein Problem mit sein

  • die Trennzeichen in Ihren Daten
  • die erste Zeile, wie @TomAugspurger feststellte

Um dies zu lösen, geben Sie beim Aufruf die Argumente sepund / oder headerArgumente an read_csv. Zum Beispiel,

df = pandas.read_csv(fileName, sep='delimiter', header=None)

Definiert im obigen Code sepIhr Trennzeichen und header=Noneteilt 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.

Grisaitis
quelle
Ja, manchmal kann ein Trennzeichen die Ursache für dieses Problem sein. Ich hatte das gleiche Problem, bei dem das Trennzeichen ein Semikolon (;) war
Anurag Sharma
43

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)

TomAugspurger
quelle
30

Ihre CSV-Datei hat möglicherweise eine variable Anzahl von Spalten und read_csvleitet 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.

Computerist
quelle
24

Dies ist definitiv ein Problem des Trennzeichens, da die meisten CSV-CSVs mit erstellt werden. sep='/t'Versuchen Sie daher read_csv, das Tabulatorzeichen (\t)mit einem Trennzeichen zu verwenden /t. Versuchen Sie daher, mit der folgenden Codezeile zu öffnen.

data=pd.read_csv("File_path", sep='\t')
Piyush S. Wanare
quelle
5
@ MichaelQueue: Das ist falsch. Eine CSV kann, obwohl sie üblicherweise durch ein Komma getrennt ist, auch durch andere Zeichen begrenzt werden. Siehe CSV-Spezifikationen . Dies kann ein Komma, ein Tabulator ('\ t'), ein Semikolon und möglicherweise zusätzliche Leerzeichen sein. :)
DJGrandpaJ
In meinem Fall handelte es sich um ein Trennzeichen. read_csv verwendet anscheinend standardmäßig Kommas, und ich habe Textfelder, die Kommas enthalten (und die Daten wurden sowieso mit einem anderen Trennzeichen gespeichert)
user108569
Wenn in den Werten Kommas verwendet werden, die Registerkarte jedoch das Trennzeichen ist und sep nicht verwendet wird (oder wie oben vorgeschlagen, die Trennzeichen, was auch immer in den Werten angenommen wird), tritt dieser Fehler auf. Stellen Sie sicher, dass das Trennzeichen in keinem der Werte vorkommt.
Andernfalls
Ich verwende Excel 2016 beim Erstellen der CSV und verwende sep = ';' Arbeit für mich
Abdullah sagte
18

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:

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

Wenn Sie die Zeilen hässlich halten möchten, um die Fehler zu behandeln, 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 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.

Robert Geiger
quelle
14

Ich hatte dieses Problem, bei dem ich versuchte, eine CSV einzulesen, ohne Spaltennamen einzugeben.

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

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.

col_names = ["col1", "col2", "col3", ...]
df = pd.read_csv(filename, names=col_names)
Steven Rouk
quelle
1
Diese Antwort ist besser, da die Zeile im Vergleich zur Verwendung von error_bad_line = False nicht gelöscht wird. Darüber hinaus können Sie leicht herausfinden, welche Zeilen die problematischen waren, nachdem Sie aus dieser Lösung einen Datenrahmen erstellt haben.
zipline86
Ich stimme @ zipline86 zu. Diese Antwort ist sicher und intelligent.
Monica Heddneck
11

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.

elPastor
quelle
8

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

Legend_Ari
quelle
6

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

df = pd.read_csv("/path/foo.csv", delimiter=';', skiprows=0, low_memory=False)
Dolch
quelle
1
Ich habe Probleme experimentiert, als ich nicht |als Trennzeichen für meine CSV-Datei festgelegt habe. Ich versuche lieber zuerst diesen Ansatz, anstatt Zeilen oder schlechte Zeilen zu überspringen.
ivanleoncz
Ich hatte auch das gleiche Problem, ich nahm an, dass "\ t" standardmäßig als Trennzeichen erkannt wird. Es hat funktioniert, als ich das Trennzeichen explizit auf "\ t" gesetzt habe.
Rahul Jha
5

Ich hatte ein ähnliches Problem beim Versuch, eine durch Tabulatoren getrennte Tabelle mit Leerzeichen, Kommas und Anführungszeichen zu lesen:

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 zu tun hat (dies ist die Standardeinstellung). Vielleicht ändert sich etwas, wenn man zu einer Python wechselt

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

Segmentation fault (core dumped)

Das ist ein anderer Fehler.
Wenn wir versuchen, Leerzeichen aus der Tabelle zu entfernen, ändert sich der Fehler von 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 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:

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 die Parsing-Engine und vermeiden Sie nicht abgrenzende Anführungszeichen / Kommas / Leerzeichen in Ihren Daten.

lotrus28
quelle
5

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():

quoting=3 # 3 correlates to csv.QUOTE_NONE for pandas
user3426943
quelle
2
stolperte über genau das Gleiche. Für mich ist dies die richtige Antwort. Der Akzeptierte verbirgt nur den Fehler.
lhk
Richtige Antwort auch für mich. +1
Taha Jirjees
4

Verwenden Sie das Trennzeichen im Parameter

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

Es wird lesen.

Bhavesh Kumar
quelle
3

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 compressionProblem wurde behoben.

result = pandas.read_csv(data_source, compression='gzip')
Regelmäßig geplante Programmierung
quelle
3

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:

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 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.

bcoz
quelle
3

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)

kepy97
quelle
3

Für diejenigen, die ähnliche Probleme mit Python 3 unter Linux haben.

pandas.errors.ParserError: Error tokenizing data. C error: Calling
read(nbytes) on source failed. Try engine='python'.

Versuchen:

df.read_csv('file.csv', encoding='utf8', engine='python')
Zstack
quelle
2

Manchmal liegt das Problem nicht in der Verwendung von Python, sondern in den Rohdaten.
Ich habe diese Fehlermeldung erhalten

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

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.

Kims Sifers
quelle
1

Ich hatte einen Datensatz mit bereits vorhandenen Zeilennummern. Ich habe index_col verwendet:

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

Das habe ich getan.

sep='::' löste mein Problem:

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

Ich hatte einen ähnlichen Fall wie diesen und Einstellung

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

hat funktioniert

Adewole Adesola
quelle
1

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!

Simin Zuo
quelle
1

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).

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 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.

Scott Skiles
quelle
1

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!

Naseer
quelle
1

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ür 5 inchwirft am Ende einen Schraubenschlüssel in die Werke. Excel entfernt einfach das zusätzliche Anführungszeichen, aber Pandas bricht ohne das error_bad_lines=Falseoben erwähnte Argument zusammen.

Andrew Silver
quelle
1

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.txtvon 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 Folgenden

14.38   14.21   0.8951  5.386   3.312   2.462   4.956   1
14.69   14.49   0.8799  5.563   3.259   3.586   5.219   1
14.11   14.1    0.8911  5.42    3.302   2.7     5       1

Verwenden Sie daher \t+im Trennzeichenmuster anstelle von \t.

data = pd.read_csv(path, sep='\t+`, header=None)
Kareem Jeiroudi
quelle
1

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_csverhalte dann einen Datenrahmen.

import io
import pandas as pd

file = open(f'{file_path}/{file_name}', 'r')
content = file.read()

# change new line character from '\r\n' to '\n'
lines = content.replace('\r', '').split('\n')

# Remove the first and last 2 lines of the file
# StringIO can be considered as a file stored in memory
df = pd.read_csv(StringIO("\n".join(lines[2:-2])), header=None)
Brian
quelle
1

In meinem Fall war das Trennzeichen nicht die Standardeinstellung ",", sondern Tab.

pd.read_csv(file_name.csv, sep='\\t',lineterminator='\\r', engine='python', header='infer')

Hinweis: "\ t" funktionierte nicht wie von einigen Quellen vorgeschlagen. "\\ t" war erforderlich.

Mihai.Mehe
quelle
0

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.

jvvw
quelle