[python] _csv. 오류 : 필드 제한보다 큰 필드 (131072)

매우 큰 필드가있는 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 파일을 어떻게 분석 할 수 있습니까? 큰 필드가있는 행을 건너 뛰는 것은 후속 단계에서 데이터를 분석해야하므로 옵션이 아닙니다.



답변

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)


답변

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

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


답변

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

csv.field_size_limit()

밖으로 [20] : 131072

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

csv.field_size_limit(100000000)

한도를 다시 확인하십시오

csv.field_size_limit()

밖으로 [22] : 100000000

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


답변

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

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


답변

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

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

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

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

csv.reader(inputfile, delimiter=';', doublequote='False', quotechar='', quoting=csv.QUOTE_NONE)


답변

때로는 행에 큰 따옴표 열이 있습니다. CSV 리더 가이 행을 읽으려고하면 열의 끝을 이해하지 못하고이 인상을 발생시킵니다. 해결책은 다음과 같습니다.

reader = csv.reader(cf, quoting=csv.QUOTE_MINIMAL)


답변

read_csvfrom pandas을 사용 하여이 줄을 건너 뛸 수 있습니다.

import pandas as pd

data_df = pd.read_csv('data.csv', error_bad_lines=False)