매우 큰 필드가있는 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.maxsize
Python 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 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'
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 비트 파이썬 상황이 균일 : 그것은에 발생하는 동작입니다 승리 .
자세한 내용은 다음 리소스를 확인하십시오.
- Python 에서 C 유형 경계로 재생 : [SO] : Python에서 C 유형 정수의 최대 값과 최소값 (@ CristiFati ‘s answer)
- 파이썬 32 비트 와 64 비트 차이점 : [SO] : 파이썬 쉘이 OS X에서 32 비트 또는 64 비트 모드로 실행되고 있는지 어떻게 알 수 있습니까? (@CristiFati 님의 답변)
답변
방금 ‘일반’CSV 파일에서 이런 일이 발생했습니다. 일부 사람들은 파일을 잘못된 형식의 파일이라고 할 수 있습니다. 이스케이프 문자, 큰 따옴표 및 구분 기호는 세미콜론이 아닙니다.
이 파일의 샘플 라인은 다음과 같습니다.
첫 번째 세포; 두 번째 “큰 따옴표와 선행 공백이있는 셀; ‘부분 인용’셀; 마지막 셀
두 번째 셀의 작은 따옴표는 파서를 레일에서 던질 것입니다. 효과가 있었던 것은 :
csv.reader(inputfile, delimiter=';', doublequote='False', quotechar='', quoting=csv.QUOTE_NONE)
답변
때로는 행에 큰 따옴표 열이 있습니다. CSV 리더 가이 행을 읽으려고하면 열의 끝을 이해하지 못하고이 인상을 발생시킵니다. 해결책은 다음과 같습니다.
reader = csv.reader(cf, quoting=csv.QUOTE_MINIMAL)
답변
read_csv
from pandas
을 사용 하여이 줄을 건너 뛸 수 있습니다.
import pandas as pd
data_df = pd.read_csv('data.csv', error_bad_lines=False)
