我有一个脚本读取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)
小智 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,则它将成为新的限制。
默认情况下将其设置为128k或0x20000(131072),对于任何合适的.csv来说,这应该足够了:
Run Code Online (Sandbox Code Playgroud)>>> import csv >>> csv.field_size_limit() 131072
但是,当处理.csv文件(使用正确的引号和定界符)时,(至少)一个字段的长度大于此大小,则会弹出错误。
为了消除错误,应该增加大小限制(为避免任何麻烦,请尝试最大可能的值)。
幕后(支票[GitHub上]:蟒/ CPython的- (主)的CPython /模块/ _csv.c用于实现细节),其保持该值的变量是一个Ç 长([维基百科]:C数据类型),其大小取决于CPU架构和OS(I L P)。经典的区别:对于64位 OS,长类型大小(以位为单位)为:
尝试设置它时,新值被检查为在长边界内,这就是为什么在某些情况下会弹出另一个异常的原因(这种情况在Win上很常见):
Run Code Online (Sandbox Code Playgroud)>>> 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.Docs]:ctypes-Python的外部函数库))设置(最大可能)限制(LONG_MAX)。它应该可以在任何CPU / OS上的Python 3和Python 2上运行。
Run Code Online (Sandbox Code Playgroud)>>> import ctypes >>> csv.field_size_limit(int(ctypes.c_ulong(-1).value // 2)) 131072 >>> csv.field_size_limit() 2147483647
有关在Python中使用C类型边界的更多详细信息,请查看[SO]:Python中C类型整数的最大值和最小值(@CristiFati的答案)。
我刚刚在“普通”CSV 文件中遇到了这种情况。有些人可能称其为无效格式文件。没有转义字符,没有双引号,分隔符是分号。
该文件中的示例行如下所示:
第一个细胞;第二个“带有一个双引号和前导空格的单元格;“部分引用”单元格;最后一个单元格
第二个单元格中的单引号会使解析器脱离轨道。有效的是:
csv.reader(inputfile, delimiter=';', doublequote='False', quotechar='', quoting=csv.QUOTE_NONE)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
91372 次 |
| 最近记录: |