Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python _csv.错误:字段大于字段限制(131072)_Python_Csv - Fatal编程技术网

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

Python _csv.错误:字段大于字段限制(131072),python,csv,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文件中读取的脚本,其中包含非常大的字段:

# 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文件?跳过具有巨大字段的行不是一个选项,因为数据需要在后续步骤中进行分析。

csv文件可能包含非常巨大的字段,因此增加
字段大小限制

import sys
import csv

csv.field_size_limit(sys.maxsize)
sys.maxsize
适用于Python2.x和3.x
sys.maxint
仅适用于Python 2.x()

更新 正如Geoff指出的,上面的代码可能会导致以下错误:
overflowerrror:Python int太大,无法转换为C long
。 为了避免这种情况,您可以使用以下快速而肮脏的代码(应该适用于使用Python 2和Python 3的每个系统):


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

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

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

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

下面是检查电流限制

csv.field_size_limit()
Out[20]:131072

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

csv.field_size_limit(100000000)
请尝试再次检查限制

csv.field_size_limit()
Out[22]:100000000


现在您将不会得到错误“\u csv.error:field大于field limit(131072)”

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

在该文件中

[csv]
field_size_limit = 1000000000
.csv字段大小通过(emphasis是我的)控制:

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

默认情况下,它设置为1310720x20000(128k),这对于任何体面的.csv都足够了:

导入csv >>> >>> >>>limit0=csv.field\u size\u limit() >>>限制 131072 >>>“0x{0:016X}”。格式(limit0) “0x0000000000020000” 但是,当处理具有正确引号和分隔符的.csv文件()时(至少)有一个字段超过此大小,会弹出错误
为了消除错误,应该增加大小限制(为了避免任何担心,尝试最大可能值)

在幕后(检查实现细节),保存此值的变量是一个Clong(),其大小取决于CPU体系结构和操作系统(ILp)。经典区别:对于64位操作系统(和Python构建),长类型大小(以位为单位)是:

  • 尼克斯:64
  • 赢:32
当尝试设置它时,新值被检查为在长边界中,这就是为什么在某些情况下会弹出另一个异常(因为sys.maxsize通常为64位宽-在Win中遇到):

>>将系统、ctypes导入为ct
>>>
>>>
>>>sys.platform,sys.maxsize,ct.sizeof(ct.c_void_p)*8,ct.sizeof(ct.c_long)*8
('win32',9223372036854775807,64,32)
>>>
>>>csv.字段大小限制(sys.maxsize)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
溢出错误:Python int太大,无法转换为C long
为避免遇到此问题,请使用技巧设置(最大可能)限制(LONG\u MAX),(感谢)。它应该可以在任何CPU/OS上使用Python3和Python2

csv.field\u size\u limit(int(ct.c\u ulong(-1.value//2)) 131072 >>>limit1=csv.field\u size\u limit() >>>限制1 2147483647 >>>“0x{0:016X}”。格式(limit1) “0x000000007FFFFFFF” Nix类操作系统上的64位Python:

>将系统、csv、ctypes导入为ct
>>>
>>>
>>>sys.platform,sys.maxsize,ct.sizeof(ct.c_void_p)*8,ct.sizeof(ct.c_long)*8
('linux',9223372036854775807,64,64)
>>>
>>>csv.字段大小限制()
131072
>>>
>>>csv.field\u size\u limit(int(ct.c\u ulong(-1).value//2))
131072
>>>limit1=csv.field\u size\u limit()
>>>限制1
9223372036854775807
>>>“0x{0:016X}”。格式(limit1)
“0x7FFFFFFFFFFFFFFF”
对于32位Python,应该在没有技巧的情况下平稳运行(因为sys.maxsize和LONG_MAX都是32位宽)
如果这个最大值仍然不够,那么需要手动干预.csv才能从Python中处理

有关详细信息,请参阅以下资源:

  • 使用Python中的C类型边界:
  • Python 32位与64位的差异:

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

此文件中的采样线如下所示:

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

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

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

您可以使用
read_csv
from
pandas
跳过这些行

将熊猫作为pd导入
data\u df=pd.read\u csv('data.csv',error\u bad\u line=False)

在使用Python2.6的64位Windows 7上,
maxInt=sys.maxsize
返回
9223372036854775807L
这会导致
类型错误:调用
csv.field\u size\u limit(maxInt)
时,limit必须是整数
不会改变这一点。一个粗略的解决方法是简单地使用
csv.field\u size\u limit(2147483647)
这当然会在其他平台上引起问题。在我的情况下,这是一个adquat,用于识别csv中的损坏值,修复其他应用程序中的导出选项,并消除对
csv.field\u size\u limit()的需要
。非常感谢您的帮助,我一直在努力找出这个bug!谢谢!!如果您正在使用csvkit(一个优秀的python库和命令行csv工具包)
csv.reader(inputfile, delimiter=';', doublequote='False', quotechar='', quoting=csv.QUOTE_NONE)