Le dimensioni dei campi CSV sono controllate tramite [Python 3.Docs]: CSV. field_size_limit ( [new_limit] ) :
Restituisce la dimensione massima del campo corrente consentita dal parser. Se viene dato new_limit , questo diventa il nuovo limite.
L'impostazione predefinita è 128k o 0x20000 ( 131072 ), che dovrebbe essere sufficiente per qualsiasi .csv decente :
>>> import csv
>>>
>>> limit0 = csv.field_size_limit()
>>> limit0
131072
>>> "0x{0:016X}".format(limit0)
'0x0000000000020000'
Tuttavia, quando si ha a che fare con un file .csv ( con virgolette e delimitatori corretti ) con (almeno) un campo più lungo di questa dimensione, viene visualizzato l'errore.
Per eliminare l'errore, è necessario aumentare il limite di dimensioni (per evitare qualsiasi preoccupazione, si tenta il valore massimo possibile).
Dietro le quinte (selezionare [GitHub]: python / cpython - (master) cpython / Modules / _csv.c per i dettagli di implementazione), la variabile che contiene questo valore è una C lunga ( [Wikipedia]: tipi di dati C ), le cui dimensioni varia a seconda dell'architettura della CPU e del sistema operativo ( I L P ). La differenza classica: per un sistema operativo a 64 bit ( build Python ), la dimensione del tipo lungo ( in bit ) è:
Quando si tenta di impostarlo, viene verificato che il nuovo valore sia lungo i limiti, ecco perché in alcuni casi viene visualizzata un'altra eccezione (questo caso è comune su Win ):
>>> 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
Per evitare di incorrere in questo problema, impostare il limite (massimo possibile) ( LONG_MAX ) usando un artificio (grazie a [Python 3.Docs]: ctypes - Una libreria di funzioni esterne per Python ). Dovrebbe funzionare su Python 3 e Python 2 , su qualsiasi CPU / sistema operativo .
>>> 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 su un sistema operativo Nix come :
>>> 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'
Per Python a 32 bit , le cose sono uniformi: è il comportamento riscontrato su Win .
Controlla le seguenti risorse per maggiori dettagli su: