_csv. 오류 : 필드 제한보다 큰 필드 (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 옵션을 사용해야했습니다.
먼지 기계

1
필자의 경우 거대한 필드가 발생할 수 있음을 나타 내기 위해 질문을 업데이트했습니다. csv 파일에 잘못된 데이터가 없습니다.
user1251007

1
@dustmachine 이러한 상황은 때때로 데이터베이스 테이블에 base64 형식으로 이미지 (또는 다른 이진 파일)를 저장하는 사람들을 발견하기 때문에 발생합니다.
wintermute

답변:


315

csv 파일은 매우 큰 필드를 포함 할 수 있으므로 다음을 늘리십시오 field_size_limit.

import sys
import csv

csv.field_size_limit(sys.maxsize)

sys.maxsizePython 2.x 및 3.x에서 작동합니다. sys.maxint파이썬 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
파이썬 2.6과 윈도우 7 64 비트에 maxInt = sys.maxsize반환 9223372036854775807L결과적으로 초래 TypeError: limit must be an integer호출 할 때 csv.field_size_limit(maxInt). 흥미롭게도을 사용해 maxInt = int(sys.maxsize)도 변경되지 않습니다. 적절한 해결 방법은 csv.field_size_limit(2147483647)다른 플랫폼에서 문제를 일으키는 사용을 단순화하는 것입니다. 필자의 경우 CSV에서 깨진 값을 식별하고 다른 응용 프로그램에서 내보내기 옵션을 수정하고에 대한 필요성을 제거하기에 적합했습니다 csv.field_size_limit().
roskakori

이것에 대해 너무 감사합니다, 나는이 버그를 오랫동안 알아 내려고 노력했습니다!
Kevin Hernandez

152

CSV 파일에 작은 따옴표 나 큰 따옴표가 포함되어 있기 때문일 수 있습니다. CSV 파일이 탭으로 구분 된 경우 다음과 같이 열어보십시오.

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

1
감사합니다!! csvkit (우수한 파이썬 라이브러리 및 명령 행 csv 툴킷)을 사용하고 있고 파일에서 불균형 작은 따옴표 나 큰 따옴표를 사용하여 원래 오류가 발생하는 경우 -u 3명령 행 옵션 (일명--quoting 3
nealmcb)을

22

아래는 전류 제한을 확인하는 것입니다

csv.field_size_limit()

밖으로 [20] : 131072

아래는 한도를 높이는 것입니다. 코드에 추가

csv.field_size_limit(100000000)

한도를 다시 확인하십시오

csv.field_size_limit()

밖으로 [22] : 100000000

이제 "_csv. 오류 : 필드가 필드 제한 (131072)보다 큽니다"라는 오류가 표시되지 않습니다.


15

csv 필드 크기는 [Python 3.Docs] : csv 를 통해 제어됩니다 . field_size_limit ( [new_limit] ) :

파서가 허용하는 현재 최대 필드 크기를 반환합니다. 경우 new_limit이 주어집니다,이 새로운 제한됩니다.

기본적으로 128k 또는 0x20000 ( 131072 ) 으로 설정되며 적절한 .csv에 충분합니다 .

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

그러나이 크기보다 적어도 하나의 필드가 더 긴 .csv 파일 ( 올바른 인용 부호구분 기호 포함 )을 처리하면 오류가 나타납니다.
오류를 제거하려면 크기 제한을 늘려야합니다 (걱정을 피하기 위해 가능한 최대 값이 시도됩니다).

장면 뒤에 ( [GitHub] : python / cpython-(마스터) cpython / Modules / _csv.c 구현 세부 사항 확인)이 값을 보유하는 변수는 C long ( [Wikipedia] : C data types )이며 크기는 CPU 아키텍처 및 OS ( I L P ) 에 따라 다릅니다 . 고전적인 차이점 : 64 비트 OS ( Python 빌드)의 경우 유형 크기 ( 비트 )는 다음과 같습니다.

  • 닉스 : 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 3Python 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'

64 비트 파이썬 A의 닉스 와 같은 OS :

>>> 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 비트 파이썬 상황이 균일 : 그것은에 발생하는 동작입니다 승리 .

자세한 내용은 다음 리소스를 확인하십시오.


2

방금 '일반'CSV 파일에서 이런 일이 발생했습니다. 일부 사람들은 파일을 잘못된 형식의 파일이라고 할 수 있습니다. 이스케이프 문자, 큰 따옴표 및 구분 기호는 세미콜론이 아닙니다.

이 파일의 샘플 라인은 다음과 같습니다.

첫 번째 세포; 두 번째 "큰 따옴표와 선행 공백이있는 셀; '부분 인용'셀; 마지막 셀

두 번째 셀의 작은 따옴표는 파서를 레일에서 던질 것입니다. 효과가 있었던 것은 :

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 2009

1
잘못된 줄 개념 pandas에는의 필드 제한을 초과하는 행이 포함됩니다 csv. 따라서이 줄을 건너 뛰고 다른 줄을 읽으려면이 솔루션을 사용할 수 있습니다. 그렇지 않으면 거대한 필드가 필요한 경우 필드 제한을 늘리는 csv.field_size_limit(100000000)것이 적절합니다.
0x01 시간

-1

일반적으로 .cassandra 디렉토리에있는 cqlshrc 파일을 찾으십시오.

해당 파일에서

[csv]
field_size_limit = 1000000000
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.