.csv字段的大小通过[Python. csv]来控制。: csv.field_size_limit([new_limit])(重点是我的):
返回解析器允许的当前最大字段大小。如果给出了new_limit,这将成为新的限制。
默认设置为131072或0x20000 (128k),这对于任何像样的.csv应该足够了:
>>>导入CSV
>>>
>>>
>>> limit0 = csv.field_size_limit()
> > > limit0
131072
> > >“0 x {0:016X}”.format (limit0)
“0 x0000000000020000”
但是,当处理一个.csv文件(带有正确的引号和分隔符),该文件的字段(至少)比这个大小长一个时,就会弹出错误提示。为了消除错误,应该增加大小限制(为了避免任何担忧,尝试最大可能的值)。
在幕后(查看[GitHub]: python/cpython - (master) cpython/Modules/_csv.c了解实现细节),保存该值的变量是一个C long ([Wikipedia]: C data types),其大小取决于CPU架构和操作系统(ILP)。经典的区别:对于064位操作系统(和Python版本),长类型大小(以位为单位)是:
拒绝:64
胜利:32
当尝试设置它时,新值会被检查是否在长边界内,这就是为什么在某些情况下会弹出另一个异常(因为sys。maxsize通常是064bit宽-在Win上遇到):
>>>导入sys, ctypes as ct
>>>
>>>
> > >“v {: d}, {: d}。{:d}”.format (* sys.version_info[3]),系统。平台,系统。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)
回溯(最近一次调用):
文件“<stdin>”,第1行,在<模块>
Python int太大,不能转换为C long
为了避免遇到这个问题,可以使用一种技巧(感谢[Python. max])设置(最大可能的)限制(LONG_MAX)。ctypes - Python的外部函数库)。它应该在任何CPU / OS上的Python 3和Python 2上工作。
> > > csv.field_size_limit (int (ct.c_ulong(1)。值// 2))
131072
>>> limit1 = csv.field_size_limit()
> > > limit1
2147483647
> > >“0 x {0:016X}”.format (limit1)
“0 x000000007fffffff”
064bit Python在类似Nix的操作系统上:
>>>导入sys, csv, ctypes作为ct
>>>
>>>
> > >“v {: d}, {: d}。{:d}”.format (* sys.version_info[3]),系统。平台,系统。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)。值// 2))
131072
>>> limit1 = csv.field_size_limit()
> > > limit1
9223372036854775807
> > >“0 x {0:016X}”.format (limit1)
“0 x7fffffffffffffff”
对于032位的Python,不需要这个技巧(因为sys。maxsize和LONG_MAX宽度为032位)。如果这个最大值仍然不够,那么.csv将需要手动干预才能从Python中处理。
查看以下资源了解更多详细信息:
[SO]: Python中C类型整数的最大值和最小值(@CristiFati的答案)
Python 064bit vs 032bit差异:[SO]:如何确定我的Python shell在OS X上以32位还是64位模式执行?(@CristiFati回答)