_csv.Error:字段大于字段限制(131072)

use*_*007 196 python csv

我有一个脚本读取csv文件中有非常大的字段:

# example from http://docs.python.org/3.3/library/csv.html?highlight=csv%20dictreader#examples
import csv
with open('some.csv', newline='') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)
Run Code Online (Sandbox Code Playgroud)

但是,这会在某些csv文件上引发以下错误:

_csv.Error: field larger than field limit (131072)
Run Code Online (Sandbox Code Playgroud)

use*_*007 273

csv文件可能包含非常大的字段,因此增加field_size_limit:

import sys
import csv

csv.field_size_limit(sys.maxsize)
Run Code Online (Sandbox Code Playgroud)

sys.maxsize适用于Python 2.x和3.x. sys.maxint只适用于Python 2.x(SO:what-is-sys-maxint-in-python-3)

更新

正如Geoff所指出的,上面的代码可能会导致以下错误:OverflowError: Python int too large to convert to C long.为了避免这种情况,您可以使用以下快速而脏的代码(适用于Python 2和Python 3的每个系统):

import sys
import csv
maxInt = sys.maxsize

while True:
    # decrease the maxInt value by factor 10 
    # as long as the OverflowError occurs.

    try:
        csv.field_size_limit(maxInt)
        break
    except OverflowError:
        maxInt = int(maxInt/10)
Run Code Online (Sandbox Code Playgroud)

  • 在带有Python 2.6的Windows 7 64位上,`maxInt = sys.maxsize`返回`9223372036854775807L`,因此在调用`csv.field_size_limit(maxInt)`时会导致`TypeError:limit必须是整数'.有趣的是,使用`maxInt = int(sys.maxsize)`不会改变这一点.一个粗略的解决方法是使用`csv.field_size_limit(2147483647)`,这当然会在其他平台上引起问题.在我的例子中,这是adquat以识别CSV中的破坏值,修复其他应用程序中的导出选项并删除对`csv.field_size_limit()`的需要. (12认同)

小智 141

这可能是因为您的CSV文件嵌入了单引号或双引号.如果您的CSV文件以制表符分隔,请尝试将其打开为:

c = csv.reader(f, delimiter='\t', quoting=csv.QUOTE_NONE)
Run Code Online (Sandbox Code Playgroud)


Tad*_*Tad 15

以下是检查当前限制

csv.field_size_limit()
Run Code Online (Sandbox Code Playgroud)

出[20]:131072

以下是增加限额.将其添加到代码中

csv.field_size_limit(100000000)
Run Code Online (Sandbox Code Playgroud)

请再次尝试检查限制

csv.field_size_limit()
Run Code Online (Sandbox Code Playgroud)

出[22]:100000000

现在你不会收到错误"_csv.Error:field than field limit(131072)"


Cri*_*ati 10

csv字段大小是通过[Python 3.Docs]:csv控制的。field_size_limit[new_limit]

返回解析器允许的当前最大字段大小。如果指定了new_limit,它将成为新的限制。

默认情况下将其设置为128k0x20000131072),对于任何合适的.csv来说,这应该足够了:

>>> import csv
>>> csv.field_size_limit()
131072
Run Code Online (Sandbox Code Playgroud)

但是,当处理.csv文件(使用正确的引号定界符)时,(至少)一个字段的长度大于此大小,则会弹出错误。
为了消除错误,应该增加大小限制(为避免任何麻烦,请尝试最大可能的值)。

幕后(支票[GitHub上]:蟒/ CPython的- (主)的CPython /模块/ _csv.c用于实现细节),其保持该值的变量是一个Ç [维基百科]:C数据类型),其大小取决于CPU架构和OSI L P)。经典的区别:对于64位 OS类型大小(以位为单位)为:

  • 尼克斯:64
  • :32

尝试设置它时,新值被检查为在边界内,这就是为什么在某些情况下会弹出另一个异常的原因(这种情况在Win上很常见):

>>> import sys
>>> 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
Run Code Online (Sandbox Code Playgroud)

为避免遇到此问题,请使用技巧((由于[Python 3.Docs]:ctypes-Python的外部函数库))设置(最大可能)限制(LONG_MAX)。它应该可以在任何CPU / OS上的Python 3Python 2运行

>>> import ctypes
>>> csv.field_size_limit(int(ctypes.c_ulong(-1).value // 2))
131072
>>> csv.field_size_limit()
2147483647
Run Code Online (Sandbox Code Playgroud)

有关在Python中使用C类型边界的更多详细信息,请查看[SO]:Python中C类型整数的最大值和最小值(@CristiFati的答案)


Ste*_*ler 7

我刚刚在“普通”CSV 文件中遇到了这种情况。有些人可能称其为无效格式文件。没有转义字符,没有双引号,分隔符是分号。

该文件中的示例行如下所示:

第一个细胞;第二个“带有一个双引号和前导空格的单元格;“部分引用”单元格;最后一个单元格

第二个单元格中的单引号会使解析器脱离轨道。有效的是:

csv.reader(inputfile, delimiter=';', doublequote='False', quotechar='', quoting=csv.QUOTE_NONE)
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

91372 次

最近记录:

6 年,8 月 前