tamanhos de campo csv são controlados via [Python 3.Docs]: csv. field_size_limit ( [new_limit] ) :
Retorna o tamanho máximo atual do campo permitido pelo analisador. Se new_limit for fornecido, esse se tornará o novo limite.
É definido por padrão como 128k ou 0x20000 ( 131072 ), o que deve ser suficiente para qualquer arquivo .csv decente :
>>> import csv
>>>
>>> limit0 = csv.field_size_limit()
>>> limit0
131072
>>> "0x{0:016X}".format(limit0)
'0x0000000000020000'
No entanto, ao lidar com um arquivo .csv ( com a citação e o delimitador corretos ) com (pelo menos) um campo maior que esse tamanho, o erro é exibido.
Para se livrar do erro, o limite de tamanho deve ser aumentado (para evitar preocupações, é tentado o valor máximo possível).
Nos bastidores (verifique [GitHub]: python / cpython - (mestre) cpython / Modules / _csv.c para obter detalhes da implementação), a variável que mantém esse valor é um C longo ( [Wikipedia]: tipos de dados C ), cujo tamanho varia de acordo com a arquitetura da CPU e do SO ( I L P ). A diferença clássica: para um sistema operacional de 64 bits ( compilação Python ), o tamanho do tipo longo ( em bits ) é:
Ao tentar defini-lo, o novo valor é verificado para estar nos limites longos , por isso, em alguns casos, outra exceção aparece (esse caso é comum no 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 esse problema, defina o limite (máximo possível) ( LONG_MAX ) usando um artifício (graças a [Python 3.Docs]: ctypes - Uma biblioteca de funções estrangeira para Python ). Ele deve funcionar no Python 3 e Python 2 , em qualquer 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 em um Nix como sistema operacional :
>>> 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 , as coisas são uniformes: é o comportamento encontrado no Win .
Verifique os seguintes recursos para obter mais detalhes sobre: