_csv.Error:フィールドがフィールド制限を超えています(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

1
私の場合、巨大なフィールドが発生する可能性があることを示すために質問を更新しました。csvファイルに不良データはありません。
user1251007

1
@dustmachineこのようなことが起こるのは、データベーステーブルにbase64形式で画像(または他のバイナリファイル)を保存している人を見つけることがあるからです。
Wintermute 2016

回答:


316

csvファイルには非常に大きなフィールドが含まれている可能性があるため、field_size_limit次の値を増やします。

import sys
import csv

csv.field_size_limit(sys.maxsize)

sys.maxsizePython 2.xおよび3.xで動作します。sys.maxintPython 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)

14
Python 2.6を搭載したWindows 7 64ビットでmaxInt = sys.maxsize9223372036854775807L、結果としてTypeError: limit must be an integerが呼び出され、結果としてa が返されますcsv.field_size_limit(maxInt)。興味深いことに、使用maxInt = int(sys.maxsize)してもこれは変わりません。大まかな回避策はcsv.field_size_limit(2147483647)、もちろん他のプラットフォームで問題を引き起こすsimlpyの使用です。私の場合、これはCSVの壊れた値を特定し、他のアプリケーションのエクスポートオプションを修正して、の必要性を取り除くことが適切でした csv.field_size_limit()
roskakori 2014年

これを本当にありがとう、私は何年もの間このバグを理解しようとしていました!
Kevin Hernandez

152

CSVファイルに一重引用符または二重引用符が埋め込まれている可能性があります。CSVファイルがタブ区切りの場合は、次のように開いてみてください。

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

1
ありがとうございました!!あなたはcsvkit(優れたPythonライブラリとコマンドラインのcsvツールキット)を使用して、元のエラーを取得している場合は、あなたのファイルがアンバランスな単一引用符または二重引用符を使用しているため、あなたは経由QUOTE_NONEを選択することができ-u 3、コマンドラインオプション、別名--quoting 3
nealmcb

22

以下は、現在の制限を確認することです

csv.field_size_limit()

Out [20]:131072

以下は、制限を増やすことです。コードに追加する

csv.field_size_limit(100000000)

制限をもう一度確認してください

csv.field_size_limit()

Out [22]:100000000

これで、「_ csv.Error:フィールドがフィールド制限(131072)を超えています」というエラーが発生しなくなりました


15

csvフィールドのサイズは、[Python 3.Docs]:csvで制御されますfield_size_limit[new_limit]

パーサーで許可されている現在の最大フィールドサイズを返します。場合new_limitが与えられ、これは新しい制限になります。

デフォルトでは128kまたは0x20000131072)に設定されており、適切な.csvにはこれで十分です。

>>> import csv
>>>
>>> limit0 = csv.field_size_limit()
>>> limit0
131072
>>> "0x{0:016X}".format(limit0)
'0x0000000000020000'

ただし、(正しい引用符区切り文字を含む.csvファイルを処理するときに、このサイズよりも(少なくとも)1フィールド長い場合、エラーが発生します。エラーを取り除くには、サイズ制限を増やす必要があります(心配を避けるために、可能な最大値が試行されます)。

裏では([GitHub]:python / cpython-(master)cpython / Modules / _csv.cチェックして実装の詳細を確認してください)、この値を保持する変数はC long[Wikipedia]:Cデータ型)で、そのサイズはCPUアーキテクチャとOSI L Pによって異なります。古典的な違い:64ビット OSPythonビルド)の場合、長い型サイズ(ビット単位)は次のとおりです。

  • ニクス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

この問題の発生を回避するには、アーティフィスを使用して(可能な限り)制限(LONG_MAX)を設定します([Python 3.Docs]のおかげ:ctypes-Pythonの外部関数ライブラリ)。任意のCPU / OSのPython 3およびPython 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'

OSのようなNix上の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、物事が均一である:それは上で遭遇した行動だ勝利

詳細については、次のリソースを確認してください。


2

「プレーンな」CSVファイルでこれが発生しました。一部の人々はそれを無効なフォーマットされたファイルと呼ぶかもしれません。エスケープ文字、二重引用符、区切り文字はセミコロンではありませんでした。

このファイルのサンプル行は次のようになります。

最初のセル; 2番目の「1つの二重引用符と先行スペースのあるセル;「部分的に引用」されたセル;最後のセル

2番目のセルの単一引用符は、パーサーをレールから外します。うまくいったのは:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.