csv alan boyutları [Python 3.Docs]: csv. field_size_limit ( [new_limit] ) :
Ayrıştırıcı tarafından izin verilen geçerli maksimum alan boyutunu döndürür. Eğer NEW_LIMIT verilir, bu yeni sınır haline gelir.
Varsayılan olarak , uygun herhangi bir .csv için yeterli olması gereken 128k veya 0x20000 ( 131072 ) olarak ayarlanmıştır :
>>> import csv
>>>
>>> limit0 = csv.field_size_limit()
>>> limit0
131072
>>> "0x{0:016X}".format(limit0)
'0x0000000000020000'
Ancak, bu boyuttan (en az) bir alan daha uzun olan bir .csv dosyasıyla ( doğru alıntı ve sınırlayıcıyla ) uğraşırken hata açılır.
Hatadan kurtulmak için boyut sınırı arttırılmalıdır (endişeleri önlemek için mümkün olan maksimum değer denenir).
Perde arkasında ( uygulama ayrıntıları için [GitHub]: python / cpython - (master) cpython / Modules / _csv.c'yi kontrol edin), bu değeri tutan değişken C uzunluğundadır ( [Wikipedia]: C veri türleri ). CPU mimarisine ve işletim sistemine ( I L P ) bağlı olarak değişir . Klasik fark: 64 bit işletim sistemi ( Python derlemesi) için uzun tip boyutu ( bit cinsinden):
Ayarlamak çalışırken, yeni değer olması kontrol edilir uzun Başka bir istisna açılan bazı durumlarda (bu durumda yaygındır yüzden, sınırları 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
Bu sorunla karşılaşmamak için bir yapay nesne kullanarak (mümkün olan maksimum) sınırı ( LONG_MAX ) ayarlayın ( [Python 3.Docs] sayesinde : ctypes - Python için bir yabancı işlev kitaplığı ). Herhangi bir CPU / OS'de Python 3 ve Python 2 üzerinde çalışmalıdır .
>>> 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 bir on Nix gibi 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'
İçin 32 bit Python işler tekdüze değildir: bu karşılaştığımız davranış var Win .
Aşağıdakiler hakkında daha fazla bilgi için aşağıdaki kaynakları kontrol edin: