Rozmiary pól csv są kontrolowane przez [Python 3.Docs]: csv. field_size_limit ( [new_limit] ) :
Zwraca bieżący maksymalny rozmiar pola dozwolony przez analizator składni. Jeśli podano new_limit , staje się to nowym limitem.
Domyślnie jest ustawiony na 128k lub 0x20000 ( 131072 ), co powinno wystarczyć dla każdego porządnego pliku .csv :
>>> import csv
>>>
>>> limit0 = csv.field_size_limit()
>>> limit0
131072
>>> "0x{0:016X}".format(limit0)
'0x0000000000020000'
Jednak w przypadku pliku .csv ( z poprawnym cytowaniem i separatorem ) mającego (przynajmniej) jedno pole dłuższe niż ten rozmiar, pojawia się błąd.
Aby pozbyć się błędu, należy zwiększyć limit rozmiaru (aby uniknąć obaw, próbowana jest maksymalna możliwa wartość).
Za kulisami (sprawdź [GitHub]: python / cpython - (master) cpython / Modules / _csv.c, aby uzyskać szczegółowe informacje na temat implementacji), zmienna przechowująca tę wartość ma długość C ( [Wikipedia]: typy danych C ), której rozmiar różni się w zależności od architektury procesora i systemu operacyjnego ( I L P ). Klasyczna różnica: w 64-bitowym systemie operacyjnym ( kompilacja w języku Python ) długi rozmiar czcionki ( w bitach ) wynosi:
Podczas próby jego ustawienia sprawdza się, czy nowa wartość znajduje się w długich granicach, dlatego w niektórych przypadkach pojawia się inny wyjątek (ten przypadek jest powszechny w 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
Aby uniknąć tego problemu, ustaw limit (maksymalny możliwy) ( LONG_MAX ) przy użyciu sztuczki (dzięki [Python 3.Docs]: ctypes - Biblioteka funkcji obcych dla Pythona ). Powinien działać na Python 3 i Python 2 na dowolnym procesorze / systemie operacyjnym .
>>> 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'
64bit Python na Nix jak OS :
>>> 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'
W 32-bitowym Pythonie rzeczy są jednolite: takie zachowanie występuje w Win .
Sprawdź następujące zasoby, aby uzyskać więcej informacji na temat: