Ukuran bidang csv dikendalikan melalui [Python 3.Docs]: csv. field_size_limit ( [new_limit] ) :
Mengembalikan ukuran bidang maksimum saat ini yang diizinkan oleh pengurai. Jika new_limit diberikan, ini menjadi batas baru.
Ini diatur secara default ke 128k atau 0x20000 ( 131072 ), yang seharusnya cukup untuk .csv yang layak :
>>> import csv
>>>
>>> limit0 = csv.field_size_limit()
>>> limit0
131072
>>> "0x{0:016X}".format(limit0)
'0x0000000000020000'
Namun, ketika berurusan dengan file .csv ( dengan kutipan dan pembatas yang benar ) memiliki (setidaknya) satu bidang lebih panjang dari ukuran ini, kesalahan muncul.
Untuk menghilangkan kesalahan, batas ukuran harus ditingkatkan (untuk menghindari kekhawatiran, nilai maksimum yang mungkin dicoba).
Di belakang layar (centang [GitHub]: python / cpython - (master) cpython / Modul / _csv.c untuk detail implementasi), variabel yang memegang nilai ini adalah C panjang ( [Wikipedia]: tipe data C ), yang ukurannya bervariasi tergantung pada arsitektur CPU dan OS ( I L P ). Perbedaan klasik: untuk OS 64bit ( Python build), ukuran tipe panjang ( dalam bit ) adalah:
Ketika mencoba untuk mengaturnya, nilai baru diperiksa berada dalam batas-batas panjang , itu sebabnya dalam beberapa kasus pengecualian lain muncul (kasus ini umum pada 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
Untuk menghindari masalah ini, setel batas (maksimum yang mungkin) ( LONG_MAX ) menggunakan artifice (terima kasih kepada [Python 3.Docs]: ctypes - Pustaka fungsi asing untuk Python ). Ini harus bekerja pada Python 3 dan Python 2 , pada CPU / OS apa pun .
>>> 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 pada Nix seperti 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'
Untuk 32bit Python , semuanya seragam: itu adalah perilaku yang ditemui pada Win .
Periksa sumber daya berikut untuk detail lebih lanjut tentang: