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ファイルを処理するときに、このサイズよりも(少なくとも)1フィールド長い場合、エラーが発生します。エラーを取り除くには、サイズ制限を増やす必要があります(心配を避けるために、可能な最大値が試行されます)。
裏では([GitHub]:python / cpython-(master)cpython / Modules / _csv.cをチェックして実装の詳細を確認してください)、この値を保持する変数はC long([Wikipedia]:Cデータ型)で、そのサイズはCPUアーキテクチャとOS(I L P)によって異なります。古典的な違い:64ビット OS(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の外部関数ライブラリ)。任意のCPU / OSの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'
OSのようなNix上の64ビットPython:
>>> 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、物事が均一である:それは上で遭遇した行動だ勝利。
詳細については、次のリソースを確認してください。