_csv.Error: Feld größer als Feldgrenze (131072)

232

Ich habe ein Skript in einer CSV-Datei mit sehr großen Feldern gelesen:

# example from http://docs.python.org/3.3/library/csv.html?highlight=csv%20dictreader#examples
import csv
with open('some.csv', newline='') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

Dies löst jedoch bei einigen CSV-Dateien den folgenden Fehler aus:

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

Wie kann ich CSV-Dateien mit großen Feldern analysieren? Das Überspringen der Zeilen mit großen Feldern ist keine Option, da die Daten in den folgenden Schritten analysiert werden müssen.

user1251007
quelle
10
Noch besser wäre es zu überlegen, warum es so große Felder gibt. Wird das in Ihren Daten erwartet? Manchmal weisen solche Fehler auf ein anderes Problem hin. Ich hatte einige schlechte Daten in meinem, die ein zufälliges doppeltes Anführungszeichen enthielten, und musste daher die Option QUOTE_NONE verwenden, die in einer anderen Antwort hier gezeigt wurde.
Staubmaschine
1
Ich habe meine Frage aktualisiert, um anzuzeigen, dass in meinem Fall große Felder auftreten können. Die CSV-Datei enthält keine fehlerhaften Daten.
user1251007
1
@dustmachine Solche Dinge passieren, weil manchmal Leute Bilder (oder andere Binärdateien) im base64-Format in Datenbanktabellen speichern.
Wintermute

Antworten:

315

Die CSV-Datei enthält möglicherweise sehr große Felder. Erhöhen Sie daher Folgendes field_size_limit:

import sys
import csv

csv.field_size_limit(sys.maxsize)

sys.maxsizefunktioniert für Python 2.x und 3.x. sys.maxintwürde nur mit Python 2.x funktionieren ( SO: Was-ist-Sys-Maxint-in-Python-3 )

Aktualisieren

Wie Geoff betonte, kann der obige Code zu folgendem Fehler führen : OverflowError: Python int too large to convert to C long. Um dies zu umgehen, können Sie den folgenden schnellen und schmutzigen Code verwenden (der auf jedem System mit Python 2 und Python 3 funktionieren sollte):

import sys
import csv
maxInt = sys.maxsize

while True:
    # decrease the maxInt value by factor 10 
    # as long as the OverflowError occurs.

    try:
        csv.field_size_limit(maxInt)
        break
    except OverflowError:
        maxInt = int(maxInt/10)
user1251007
quelle
14
Gibt unter Windows 7 64bit mit Python 2.6 maxInt = sys.maxsizezurück, 9223372036854775807Lwas folglich zu einem TypeError: limit must be an integerAufruf führt csv.field_size_limit(maxInt). Interessanterweise maxInt = int(sys.maxsize)ändert die Verwendung dies nicht. Eine grobe Problemumgehung ist die einfache Verwendung, csv.field_size_limit(2147483647)die natürlich Probleme auf anderen Plattformen verursacht. In meinem Fall war dies adquat, um den fehlerhaften Wert in der CSV zu identifizieren, die Exportoptionen in der anderen Anwendung zu korrigieren und die Notwendigkeit für zu entfernen csv.field_size_limit().
Roskakori
Vielen Dank dafür, ich habe seit Ewigkeiten versucht, diesen Fehler herauszufinden!
Kevin Hernandez
152

Dies kann daran liegen, dass in Ihre CSV-Datei einfache oder doppelte Anführungszeichen eingebettet sind. Wenn Ihre CSV-Datei durch Tabulatoren getrennt ist, öffnen Sie sie wie folgt:

c = csv.reader(f, delimiter='\t', quoting=csv.QUOTE_NONE)
CSP
quelle
1
Danke dir!! Wenn Sie csvkit (eine hervorragende Python-Bibliothek und ein Befehlszeilen-CSV-Toolkit) verwenden und den ursprünglichen Fehler erhalten, weil Ihre Datei unausgeglichene einfache oder doppelte Anführungszeichen verwendet, können Sie QUOTE_NONE über die -u 3Befehlszeilenoption aka--quoting 3
nealmcb
22

Unten ist die aktuelle Grenze zu überprüfen

csv.field_size_limit()

Out [20]: 131072

Unten ist das Limit zu erhöhen. Fügen Sie es dem Code hinzu

csv.field_size_limit(100000000)

Versuchen Sie erneut, das Limit zu überprüfen

csv.field_size_limit()

Out [22]: 100000000

Jetzt wird der Fehler "_csv.Error: Feld größer als Feldlimit (131072)" nicht angezeigt.

Bisschen
quelle
15

CSV -Feldgrößen werden über [Python 3.Docs] gesteuert : CSV. field_size_limit ( [new_limit] ) :

Gibt die aktuelle maximale Feldgröße zurück, die vom Parser zugelassen wird. Wenn new_limit angegeben wird, wird dies das neue Limit.

Es wird standardmäßig gesetzt 128k oder 0x20000 ( 131072 ), die für jeden anständig genug sollte .csv :

>>> import csv
>>>
>>> limit0 = csv.field_size_limit()
>>> limit0
131072
>>> "0x{0:016X}".format(limit0)
'0x0000000000020000'

Wenn Sie jedoch mit einer CSV- Datei ( mit dem richtigen Anführungszeichen und Trennzeichen ) arbeiten, die (mindestens) ein Feld länger als diese Größe hat, wird der Fehler angezeigt.
Um den Fehler zu beseitigen, sollte die Größenbeschränkung erhöht werden (um Bedenken zu vermeiden, wird der maximal mögliche Wert versucht).

Hinter den Kulissen ( siehe [GitHub]: python / cpython - (master) cpython / Modules / _csv.c für Implementierungsdetails) ist die Variable, die diesen Wert enthält, ein C long ( [Wikipedia]: C-Datentypen ), deren Größe variiert je nach CPU- Architektur und Betriebssystem ( I L P ). Der klassische Unterschied: Für ein 64-Bit- Betriebssystem ( Python- Build ) beträgt die lange Schriftgröße ( in Bit ):

  • Nix : 64
  • Gewinn : 32

Beim Versuch, ihn festzulegen, wird überprüft , ob der neue Wert innerhalb der langen Grenzen liegt. Aus diesem Grund wird in einigen Fällen eine weitere Ausnahme angezeigt (dieser Fall tritt häufig bei Win auf ):

>>> import sys
>>>
>>> sys.platform, sys.maxsize
('win32', 9223372036854775807)
>>>
>>> csv.field_size_limit(sys.maxsize)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: Python int too large to convert to C long

Um dieses Problem zu vermeiden, setzen Sie das (maximal mögliche) Limit ( LONG_MAX ) mit einem Kunstgriff (dank [Python 3.Docs]: ctypes - Eine Fremdfunktionsbibliothek für Python ). Es sollte unter Python 3 und Python 2 auf jeder CPU / jedem Betriebssystem funktionieren .

>>> import ctypes as ct
>>>
>>> csv.field_size_limit(int(ct.c_ulong(-1).value // 2))
131072
>>> limit1 = csv.field_size_limit()
>>> limit1
2147483647
>>> "0x{0:016X}".format(limit1)
'0x000000007FFFFFFF'

64-Bit- Python unter einem Nix- ähnlichen Betriebssystem :

>>> import sys, csv, ctypes as ct
>>>
>>> sys.platform, sys.maxsize
('linux', 9223372036854775807)
>>>
>>> csv.field_size_limit()
131072
>>>
>>> csv.field_size_limit(int(ct.c_ulong(-1).value // 2))
131072
>>> limit1 = csv.field_size_limit()
>>> limit1
9223372036854775807
>>> "0x{0:016X}".format(limit1)
'0x7FFFFFFFFFFFFFFF'

Für 32-Bit- Python sind die Dinge einheitlich: Es ist das Verhalten, das unter Win auftritt .

Überprüfen Sie die folgenden Ressourcen auf weitere Details zu:

CristiFati
quelle
2

Mir ist das gerade in einer "einfachen" CSV-Datei passiert. Einige Leute nennen es möglicherweise eine ungültig formatierte Datei. Keine Escapezeichen, keine doppelten Anführungszeichen und Trennzeichen waren ein Semikolon.

Eine Beispielzeile aus dieser Datei würde folgendermaßen aussehen:

Erste Zelle; Zweite "Zelle mit einem doppelten Anführungszeichen und führendem Leerzeichen; 'teilweise zitierte' Zelle; letzte Zelle

Das einfache Anführungszeichen in der zweiten Zelle würde den Parser von den Schienen werfen. Was funktionierte war:

csv.reader(inputfile, delimiter=';', doublequote='False', quotechar='', quoting=csv.QUOTE_NONE)
Steffen Winkler
quelle
1

Manchmal enthält eine Zeile eine doppelte Anführungsspalte. Wenn der CSV-Leser versucht, diese Zeile zu lesen, das Ende der Spalte nicht zu verstehen, und diese Erhöhung auslösen. Die Lösung ist unten:

reader = csv.reader(cf, quoting=csv.QUOTE_MINIMAL)
Ahmet Erkan ÇELİK
quelle
0

Sie können read_csvvon verwenden pandas, um diese Zeilen zu überspringen.

import pandas as pd

data_df = pd.read_csv('data.csv', error_bad_lines=False)
0x01h
quelle
Es gibt keine schlechte Zeile ... wie in der Frage geschrieben: Die CSV-Dateien enthalten riesige Felder und diese Daten müssen analysiert werden.
user1251007
1
Das Konzept für pandasfehlerhafte Linien enthält die Zeilen, die die Feldgrenze von überschreiten csv. Wenn Sie diese Zeilen überspringen und andere Zeilen erfolgreich lesen möchten, können Sie diese Lösung verwenden. Andernfalls ist es angebracht, das Feldlimit um zu erhöhen, wenn große Felder für Sie erforderlich sind csv.field_size_limit(100000000).
0x01h
-1

Suchen Sie die cqlshrc-Datei, die normalerweise im Verzeichnis .cassandra abgelegt ist.

In dieser Datei anhängen,

[csv]
field_size_limit = 1000000000
Abdul Waseh
quelle