Розміри полів 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 довгою ( [Wikipedia]: типи даних 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 .
Щоб отримати докладнішу інформацію, перегляньте такі ресурси: