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