303

非常に大きなフィールドを持つ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ファイルを分析するにはどうすればよいですか?後続のステップでデータを分析する必要があるため、巨大なフィールドのある行をスキップすることはできません。

4

8 に答える 8

423

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

import sys
import csv

csv.field_size_limit(sys.maxsize)

sys.maxsizePython2.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。これを回避するには、次の迅速で汚いコードを使用できます(Python2およびPython3を使用するすべてのシステムで機能するはずです)。

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)
于 2013-02-25T09:38:02.160 に答える
172

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

c = csv.reader(f, delimiter='\t', quoting=csv.QUOTE_NONE)
于 2013-08-23T17:52:10.650 に答える
42

.csvフィールドサイズは[Python.Docs]を介して制御されます:csv.field_size_limit([new_limit])強調は私のものです):

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

デフォルトでは131072または0x20000128k )に設定されています。これは、適切な.csvには十分なはずです。

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

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

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

  • Nix64
  • 勝つ32

設定しようとすると、新しい値が長い境界にあることがチェックされます。そのため、場合によっては別の例外がポップアップします(sys.maxsizeは通常064ビット幅であるため-Winで発生します

>>> import sys, ctypes as ct
>>>
>>>
>>> "v{:d}.{:d}.{:d}".format(*sys.version_info[:3]), sys.platform, sys.maxsize, ct.sizeof(ct.c_void_p) * 8, ct.sizeof(ct.c_long) * 8
('v3.9.9', 'win32', 9223372036854775807, 64, 32)
>>>
>>> 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.Docs]のおかげで:ctypes-Python用の外部関数ライブラリ)。Python3およびPython2、任意のCPU / OSで動作するはずです。

>>> 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上の064ビットPython

>>> import sys, csv, ctypes as ct
>>>
>>>
>>> "v{:d}.{:d}.{:d}".format(*sys.version_info[:3]), sys.platform, sys.maxsize, ct.sizeof(ct.c_void_p) * 8, ct.sizeof(ct.c_long) * 8
('v3.8.10', 'linux', 9223372036854775807, 64, 64)
>>>
>>> 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'

032ビット Pythonの場合、問題なくスムーズに実行できるはずです(sys.maxsizeLONG_MAXはどちらも032ビット幅であるため)。
それでもこの最大値が十分でない場合は、 Pythonから.csvを処理するために手動で介入する必要があります。

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

于 2019-02-04T13:31:55.473 に答える
34

以下は現在の制限を確認するためのものです

csv.field_size_limit()

アウト[20]:131072

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

csv.field_size_limit(100000000)

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

csv.field_size_limit()

Out [22]:100000000

これで、「_ csv.Error:フィールドがフィールド制限(131072)より大きい」というエラーは発生しません。

于 2018-03-20T14:28:37.893 に答える
4

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

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

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

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

csv.reader(inputfile, delimiter=';', doublequote='False', quotechar='', quoting=csv.QUOTE_NONE)
于 2019-03-12T14:16:56.620 に答える
1

行に二重引用符の列が含まれる場合があります。csvリーダーがこの行を読み取ろうとすると、列の終わりがわかりません。このレイズを起動します。解決策は以下のとおりです。

reader = csv.reader(cf, quoting=csv.QUOTE_MINIMAL)
于 2017-08-14T14:51:52.233 に答える
-1

read_csvfromを使用しpandasて、これらの行をスキップできます。

import pandas as pd

data_df = pd.read_csv('data.csv', error_bad_lines=False)
于 2019-10-10T11:03:40.510 に答える
-2

通常.cassandraディレクトリに配置されているcqlshrcファイルを見つけます。

そのファイルの追加で、

[csv]
field_size_limit = 1000000000
于 2019-01-26T03:45:24.363 に答える