Los tamaños de campo csv se controlan a través de [Python 3.Docs]: csv. field_size_limit ( [new_limit] ) :
Devuelve el tamaño de campo máximo actual permitido por el analizador. Si se da new_limit , este se convierte en el nuevo límite.
Está configurado de forma predeterminada en 128k o 0x20000 ( 131072 ), lo que debería ser suficiente para cualquier .csv decente:
>>> import csv
>>>
>>> limit0 = csv.field_size_limit()
>>> limit0
131072
>>> "0x{0:016X}".format(limit0)
'0x0000000000020000'
Sin embargo, cuando se trata de un archivo .csv ( con el delimitador y las comillas correctas ) que tiene (al menos) un campo más largo que este tamaño, aparece el error.
Para deshacerse del error, se debe aumentar el límite de tamaño (para evitar preocupaciones, se intenta el valor máximo posible).
Detrás de escena (marque [GitHub]: python / cpython - (master) cpython / Modules / _csv.c para detalles de implementación), la variable que contiene este valor es una C larga ( [Wikipedia]: tipos de datos C ), cuyo tamaño varía según la arquitectura de la CPU y el sistema operativo ( I L P ). La diferencia clásica: para un 64bit SO de ( compilación de Python ), el tamaño de letra largo ( en bits ) es:
Al intentar establecerlo, se verifica que el nuevo valor esté en límites largos , por eso en algunos casos aparece otra excepción (este caso es común en 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
Para evitar encontrarse con este problema, establezca el límite (máximo posible) ( LONG_MAX ) utilizando un artificio (gracias a [Python 3.Docs]: ctypes - Una biblioteca de funciones foráneas para Python ). Debería funcionar en Python 3 y Python 2 , en cualquier CPU / OS .
>>> 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'
Python de 64 bits en un Nix como SO :
>>> 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'
Para Python de 32 bits , las cosas son uniformes: es el comportamiento encontrado en Win .
Consulte los siguientes recursos para obtener más detalles sobre: