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

时间:2013-02-25 09:38:02

标签: 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)

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

_csv.Error: field larger than field limit (131072)

7 个答案:

答案 0 :(得分:241)

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

import sys
import csv

csv.field_size_limit(sys.maxsize)

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)

答案 1 :(得分:132)

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

c = csv.reader(f, delimiter='\t', quoting=csv.QUOTE_NONE)

答案 2 :(得分:15)

以下是检查当前限制

csv.field_size_limit()

Out [20]:131072

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

csv.field_size_limit(100000000)

再次尝试检查限制

csv.field_size_limit()

Out [22]:100000000

现在你不会得到错误" _csv.Error:字段大于字段限制(131072)"

答案 3 :(得分:4)

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

  

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

默认设置为 128k 0x20000 131072 ) ,对于任何体面的 .csv

>>> import csv
>>> csv.field_size_limit()
131072

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

在幕后(请查看[GitHub]: python/cpython - (master) cpython/Modules/_csv.c,了解实现的详细信息),保存此值的变量为 C long [Wikipedia]: C data types),其大小 CPU 架构和 OS I L P )而异。经典差异:对于 64位 OS long 类型大小(以位为单位)为:

  • Nix :64
  • Win :32

尝试设置它时,新值被检查为在 long 边界内,这就是为什么在某些情况下会弹出另一个异常的原因(这种情况在 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

为避免遇到此问题,请使用技巧(感谢[Python 3]: ctypes - A foreign function library for Python)来设置(最大可能)限制( LONG_MAX )。它可以在任何 CPU / OS 上的 Python 3 Python 2 上运行。

>>> import ctypes
>>> csv.field_size_limit(int(ctypes.c_ulong(-1).value // 2))
131072
>>> csv.field_size_limit()
2147483647

有关在 Python 中使用 C 类型边界的更多信息,请选中[SO]: Maximum and minimum value of C types integers from Python (@CristiFati's answer)

答案 4 :(得分:1)

有时,一行包含双引号列。当csv阅读器尝试读取此行时,不理解列的结尾并触发此提升。 解决方案如下:

reader = csv.reader(cf, quoting=csv.QUOTE_MINIMAL)

答案 5 :(得分:0)

找到通常放在.cassandra目录中的cqlshrc文件。

在该文件的末尾,

[csv]
field_size_limit = 1000000000

答案 6 :(得分:0)

您可以使用read_csv中的pandas跳过这些行。

import pandas as pd

data_df = pd.read_csv('data.csv', error_bad_lines=False)