ขนาดฟิลด์csvถูกควบคุมผ่าน[Python 3.Docs]: csv field_size_limit ( [new_limit] ) :
ส่งคืนขนาดฟิลด์สูงสุดในปัจจุบันที่ parser อนุญาต หากได้รับ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 - (หลัก) cpython / Modules / _csv.cสำหรับรายละเอียดการนำไปใช้) ตัวแปรที่เก็บค่านี้คือC long ( [Wikipedia]: C ชนิดข้อมูล ) ขนาดของมันขึ้นอยู่กับสถาปัตยกรรมของCPUและระบบปฏิบัติการ ( I L P ) ความแตกต่างแบบคลาสสิก: สำหรับระบบปฏิบัติการ64 บิต ( บิลด์ไพ ธ อน ) ขนาดแบบยาว (เป็นบิต ) คือ:
เมื่อพยายามที่จะตั้งค่าใหม่จะถูกตรวจสอบให้อยู่ในขอบเขตที่ยาวนั่นคือสาเหตุที่ในบางกรณีมีข้อยกเว้นอื่นปรากฏขึ้น (กรณีนี้เป็นเรื่องปกติใน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 ) มันควรจะทำงานในหลาม 3และงูหลาม 2 , ที่ใด ๆของ CPU / OS
>>> 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เช่น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'
สำหรับ32bit หลามสิ่งที่มีเครื่องแบบ: มันเป็นพฤติกรรมที่พบในวิน
ตรวจสอบแหล่งข้อมูลต่อไปนี้สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับ: