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文件(使用正确的引号和定界符)时,(至少)一个字段的长度大于此大小,则会弹出错误。
为了消除错误,应该增加大小限制(为避免任何麻烦,请尝试最大可能的值)。
在后台(请查看[GitHub]:python / cpython-(主)cpython / Modules / _csv.c了解实现细节),保存此值的变量为C long([Wikipedia]:C数据类型),其大小根据CPU体系结构和OS(I L P)的不同而不同。经典的区别:对于64位 操作系统(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
为避免遇到此问题,请使用技巧((由于[Python 3.Docs]:ctypes-Python的外部函数库))设置(最大可能)限制(LONG_MAX)。它应该可以在任何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'
Nix之类的OS上的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,事情是统一的:这是Win上遇到的行为。
请查看以下资源,以获取有关以下内容的更多详细信息: