Размеры полей CSV контролируются с помощью [Python 3.Docs]: CSV. field_size_limit ( [new_limit] ) :
Возвращает текущий максимальный размер поля, разрешенный парсером. Если задано new_limit , это становится новым пределом.
По умолчанию он равен 128k или 0x20000 ( 131072 ), что должно быть достаточно для любого приличного .csv :
>>> import csv
>>>
>>> limit0 = csv.field_size_limit()
>>> limit0
131072
>>> "0x{0:016X}".format(limit0)
'0x0000000000020000'
Однако при работе с файлом .csv ( с правильными кавычками и разделителями ), имеющими (как минимум) на одно поле длиннее этого размера, появляется ошибка.
Чтобы избавиться от ошибки, необходимо увеличить предел размера (чтобы избежать каких-либо забот, делается попытка получить максимально возможное значение).
За кулисами (проверьте [GitHub]: python / cpython - (master) cpython / Modules / _csv.c для деталей реализации), переменная, которая содержит это значение, имеет длину C ( [Википедия]: типы данных C ), размер которой варьируется в зависимости от архитектуры процессора и ОС ( I L P ). Классическое отличие: для 64-битной ОС ( сборка Python ) размер длинного шрифта ( в битах ):
При попытке установить его проверяется, чтобы новое значение находилось в длинных границах, поэтому в некоторых случаях появляется другое исключение (этот случай распространен в 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
Чтобы избежать этой проблемы, установите (максимально возможный) предел ( LONG_MAX ) с помощью искусственного устройства (благодаря [Python 3.Docs]: ctypes - библиотека сторонних функций для Python ). Он должен работать на Python 3 и Python 2 , на любом процессоре / ОС .
>>> 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-битный Python на Nix- подобной ОС :
>>> 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'
Для 32-битного Python все одинаково: такое поведение встречается на Win .
Проверьте следующие ресурсы для более подробной информации о: