_csv.Error: field larger than field limit (131072)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Nobuddy
User
Beiträge: 996
Registriert: Montag 30. Januar 2012, 16:38

Hallo zusammen,

habe seit heute das Problem, dass hier:

Code: Alles auswählen

            txt_file = list()
            with codecs.open(self.finish_path, 'r', 'utf-8') as csvfile:
                reader = csv.reader(csvfile, delimiter="\t", quotechar='^')
                for i, row in enumerate(reader):
                    if not header and i == self.table_header:
                        continue
                    line = list()
                    for cell in row:
                        line.append(re.sub("\r\n", "\n", cell).strip())
                    txt_file.append(line)
ich folgende Fehlermeldung erhalte:
_csv.Error: field larger than field limit (131072)
Könnt Ihr mir sagen, was diese Fehlermeldung genau zu bedeuten hat und wie ich dieses Problem lösen kann?

Grüße Nobuddy
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Nobuddy: das Fieldlimit ist da, um zu verhindern, dass fehlende Anführungszeichen dazu führen, dass der komplette Dateiinhalt in eine Zelle geschrieben wird. Also entweder hast Du tatsächlich eine Zelle die Länger ist als 131072 Zeichen oder Deine Datei ist kaputt. Im ersten Fall kannst Du das Limit hochsetzen.
Nobuddy
User
Beiträge: 996
Registriert: Montag 30. Januar 2012, 16:38

Hallo Sirius3,

Danke für Deine Antwort!
Ich gehe mal davon aus, dass die Datei ok ist.
Wie kann ich das Linit hoch setzen?

Grüße Nobuddy
Nobuddy
User
Beiträge: 996
Registriert: Montag 30. Januar 2012, 16:38

Habe die Lösung dazu gefunden!

Code: Alles auswählen

csv.field_size_limit(sys.maxsize)
Jetzt kommt keine Fehlermeldung mehr!
Nobuddy
User
Beiträge: 996
Registriert: Montag 30. Januar 2012, 16:38

Habe mich doch zu früh gefreut!
Von der Datei, lassen sich 59575 Zeilen von 59739 Zeilen korrekt bearbeiten.
Die Restlichen dürften irgend einen Fehler haben, dass evtl. kein Zeilenende vorhanden ist oder dies irgendwie fehlerhaft ist.

Mit obiger Lösung ließen sich nur 36766 Zeilen verarbeiten.
Mit dieser Lösung, gehen zumindest 59575 Zeilen fehlerfrei.

Code: Alles auswählen

            txt_file = list()
            with codecs.open(self.finish_path, 'r', 'utf-8') as csvfile:
                reader = csv.reader(csvfile, delimiter="\t", quotechar='^')
                try:
                    for i, row in enumerate(reader):
                        if not header and i == self.table_header:
                            continue
                        line = list()
                        for cell in row:
                            line.append(re.sub("\r\n", "\n", cell).strip())
                        txt_file.append(line)
                except:
                    for i, row in enumerate(reader):
                        if not header and i == self.table_header:
                            continue
                        line = list()
                        for cell in row:
                            line.append(re.sub("\r\n", "\n", cell).strip())
                        txt_file.append(line)
Dass dieser Code kompletter Quatsch ist, sehe ich genauso.
Warum es dann doch bei dieser Datei funktioniert, kann ich mir nur so erklären, dass der fehlerbehaftete Bereich in einem Stück ist und durch das except abgefangen wird. 'except _csv.Error' hat nicht funktioniert, daher nur except.

Wenn es jetzt mehrere verschiedene fehlerhafte Bereiche in der Datei geben würde, würde Obiges auch nicht funktionieren.

Welche Möglichkeit würde es da geben, die fehlerhaften Bereiche aufzufinden und zu reparieren?

Grüße Nobuddy
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Nobuddy: die Exception ist Error und im Modul csv aus dem internen Modul _csv importiert, korrekt ist also csv.Error. Das reader Objekt hat ein Attribut line_num, in dem steht die Zeile, wo der Fehler aufgetreten ist.
Nobuddy
User
Beiträge: 996
Registriert: Montag 30. Januar 2012, 16:38

Sirius3 Danke, für Deine Info, das hilft mir weiter!

Hiermit:

Code: Alles auswählen

            txt_file = list()
            with codecs.open(self.finish_path, 'r', self.coding) as csvfile:
                reader = csv.reader(csvfile, delimiter="\t", quotechar='^')
                try:
                    for i, row in enumerate(reader):
                        if not header and i == self.table_header:
                            continue
                        line = list()
                        for cell in row:
                            line.append(re.sub("\r\n", "\n", cell).strip())
                        txt_file.append(line)
                except csv.Error:
                    print(reader.line_num)
erhalte ich die Print-Ausgabe, Zeilen-Nummer 36949.
Der Fehler sollte dann bis Zeilen-Nummer 37113 gehen.

Mal schauen, ob ich diesen Zeilen-Bereich repariert bekomme.

Grüße Nobuddy
Antworten