_csv。错误:字段大于字段限制(131072)


232

我在具有很大字段的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)

如何分析具有巨大字段的csv文件?跳过具有巨大字段的行不是一种选择,因为需要在后续步骤中分析数据。


10
最好考虑一下为什么您的数据中会有这么大的字段?有时,诸如此类的错误表明存在不同的问题。我的一些坏数据中包含一个随机的双引号字符,因此不得不使用此处另一个答案中所示的QUOTE_NONE选项。
Dustmachine '16

1
我更新了我的问题,以表明在我的情况下可能会出现巨大的领域。csv文件中没有错误数据。
user1251007 '16

1
@dustmachine之所以会发生这种情况,是因为有时您会发现人们以base64格式将图像(或其他二进制文件)存储在数据库表中。
wintermute 2016年

Answers:


315

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(因此: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)

14
在具有Python 2.6的Windows 7 64位上,maxInt = sys.maxsize返回9223372036854775807L,因此在TypeError: limit must be an integer调用时导致a csv.field_size_limit(maxInt)。有趣的是,使用maxInt = int(sys.maxsize)不会改变这一点。一个简单的解决方法是模拟使用csv.field_size_limit(2147483647),这当然会导致其他平台出现问题。就我而言,这足以识别CSV中的损坏值,修复其他应用程序中的导出选项,并消除了对的需要 csv.field_size_limit()
roskakori 2014年

非常感谢您,我多年来一直在努力找出该错误!
凯文·埃尔南德斯

152

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

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

1
谢谢!!如果您使用的是csvkit(一个出色的python库和命令行csv工具包),并且由于文件使用不平衡的单引号或双引号而出现原始错误,则可以通过-u 3命令行选项(即--quoting 3
nealmcb

22

下面是检查当前限制

csv.field_size_limit()

出[20]:131072

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

csv.field_size_limit(100000000)

再次尝试检查限制

csv.field_size_limit()

出[22]:100000000

现在您将不会收到错误“ _csv.Error:字段大于字段限制(131072)”


15

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

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

默认情况下将其设置为128k0x20000131072),对于任何合适的.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体系结构和OSI L P)的不同而不同。经典的区别:对于64位 操作系统Python构建),字体大小(以位单位)为:

  • 尼克斯64
  • 32

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

请查看以下资源,以获取有关以下内容的更多详细信息:


2

我只是在“纯” CSV文件中遇到了这种情况。有些人可能将其称为无效的格式化文件。没有转义字符,没有双引号和定界符是分号。

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

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

第二个单元格中的单引号将使解析器脱离其轨道。起作用的是:

csv.reader(inputfile, delimiter=';', doublequote='False', quotechar='', quoting=csv.QUOTE_NONE)

1

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

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

0

您可以使用read_csvfrom pandas跳过这些行。

import pandas as pd

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

如问题中所写,没有坏处……CSV文件包含巨大的字段,并且需要分析此数据。
user1251007

1
错误行概念中pandas的行超出了字段限制csv。因此,如果您想跳过这些行并成功阅读其他行,则可以使用此解决方案。否则,当您需要巨大的字段时,增加字段限制csv.field_size_limit(100000000)为宜。
0x01h

-1

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

在该文件中,

[csv]
field_size_limit = 1000000000
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.