我在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)
答案 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 类型大小(以位为单位)为:
尝试设置它时,新值被检查为在 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)