.csv字段大小通过[Python.Docs] 控制: csv.field_size_limit([new_limit])(重点是我的):
返回解析器允许的当前最大字段大小。如果给出了new_limit,这将成为新的 limit。
它默认设置为131072或0x20000 ( 128k ),对于任何体面的.csv来说应该足够了:
>>> import csv
>>>
>>>
>>> limit0 = csv.field_size_limit()
>>> limit0
131072
>>> "0x{0:016X}".format(limit0)
'0x0000000000020000'
但是,当处理具有(至少)一个字段长于此大小的.csv文件(具有正确的引用和分隔符)时,会弹出错误。
为了消除错误,应该增加大小限制(为避免任何担忧,尝试最大可能值)。
在幕后(查看[GitHub]: python/cpython - (master) cpython/Modules/_csv.c了解实现细节),保存这个值的变量是一个C long ( [Wikipedia]: C data types ),它的大小取决于CPU架构和操作系统( I L P )。经典的区别:对于064 位 操作系统(和Python构建),长类型大小(以位为单位)为:
当尝试设置它时,新值被检查是否在长边界内,这就是为什么在某些情况下会弹出另一个异常(因为sys.maxsize通常是064位宽 - 在Win上遇到):
>>> import sys, ctypes as ct
>>>
>>>
>>> "v{:d}.{:d}.{:d}".format(*sys.version_info[:3]), sys.platform, sys.maxsize, ct.sizeof(ct.c_void_p) * 8, ct.sizeof(ct.c_long) * 8
('v3.9.9', 'win32', 9223372036854775807, 64, 32)
>>>
>>> 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.Docs]:ctypes - A foreign function library for Python)。它应该适用于Python 3和Python 2,在任何CPU / OS上。
>>> 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'
064 位 Python在Nix之类的操作系统上:
>>> import sys, csv, ctypes as ct
>>>
>>>
>>> "v{:d}.{:d}.{:d}".format(*sys.version_info[:3]), sys.platform, sys.maxsize, ct.sizeof(ct.c_void_p) * 8, ct.sizeof(ct.c_long) * 8
('v3.8.10', 'linux', 9223372036854775807, 64, 64)
>>>
>>> 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'
对于032 位 Python,事情应该运行顺利,没有技巧(因为sys.maxsize和LONG_MAX都是032位宽)。
如果这个最大值仍然不够,那么.csv将需要手动干预才能从Python处理。
查看以下资源以获取更多详细信息: