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.
Antworten:
Die CSV-Datei enthält möglicherweise sehr große Felder. Erhöhen Sie daher Folgendes
field_size_limit
:sys.maxsize
funktioniert für Python 2.x und 3.x.sys.maxint
wü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):quelle
maxInt = sys.maxsize
zurück,9223372036854775807L
was folglich zu einemTypeError: limit must be an integer
Aufruf führtcsv.field_size_limit(maxInt)
. InteressanterweisemaxInt = 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 entfernencsv.field_size_limit()
.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:
quelle
-u 3
Befehlszeilenoption aka--quoting 3
Unten ist die aktuelle Grenze zu überprüfen
Out [20]: 131072
Unten ist das Limit zu erhöhen. Fügen Sie es dem Code hinzu
Versuchen Sie erneut, das Limit zu überprüfen
Out [22]: 100000000
Jetzt wird der Fehler "_csv.Error: Feld größer als Feldlimit (131072)" nicht angezeigt.
quelle
CSV -Feldgrößen werden über [Python 3.Docs] gesteuert : CSV. field_size_limit ( [new_limit] ) :
Es wird standardmäßig gesetzt 128k oder 0x20000 ( 131072 ), die für jeden anständig genug sollte .csv :
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 ):
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 ):
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 .
64-Bit- Python unter einem Nix- ähnlichen Betriebssystem :
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:
quelle
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:
Das einfache Anführungszeichen in der zweiten Zelle würde den Parser von den Schienen werfen. Was funktionierte war:
quelle
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:
quelle
Sie können
read_csv
von verwendenpandas
, um diese Zeilen zu überspringen.quelle
pandas
fehlerhafte Linien enthält die Zeilen, die die Feldgrenze von überschreitencsv
. 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 sindcsv.field_size_limit(100000000)
.Suchen Sie die cqlshrc-Datei, die normalerweise im Verzeichnis .cassandra abgelegt ist.
In dieser Datei anhängen,
quelle