source

Python Panda 오류 데이터 토큰화

gigabyte 2022. 9. 15. 22:52
반응형

Python Panda 오류 데이터 토큰화

팬더를 사용하여 .csv 파일을 조작하려고 하는데 다음 오류가 나타납니다.

판다 파서CParserError: 데이터 토큰화 중 오류가 발생했습니다.C 오류: 줄 3에 2개의 필드가 있어야 하며 12개가 표시되었습니다.

팬더 문서를 읽어보려 했지만 아무 것도 못 찾았어요

코드는 간단합니다.

path = 'GOOG Key Ratios.csv'
#print(open(path).read())
data = pd.read_csv(path)

떻게하 하결 ?결? ????csv른듈른른른른른른른른?

Morningstar에서 온 파일입니다.

시험해 볼 수도 있습니다.

data = pd.read_csv('file1.csv', on_bad_lines='skip')

문제가 되는 행은 건너뜁니다.

편집

판다의 경우 1.3.0 미만으로 시도

data = pd.read_csv("file1.csv", error_bad_lines=False)

팬더 API 참조에 따릅니다.

에 문제가 있을 수 있습니다.

  • 데이터의 구분 기호
  • @TomAugspurger가 지적한 바와 같이 첫 번째 줄

문제를 해결하려면 , 「어느 정도인지」를해 보세요.sep "/"/"header가 " " " 를 호출할 때read_csv를 들면예를 들어.

df = pandas.read_csv(filepath, sep='delimiter', header=None)

에서는 '''는 '''로 되어 있습니다'''sep와 '''를 정의합니다.header=None는 소스 데이터에 헤더/컬럼 제목 행이 없음을 판다에게 알립니다.문서에서는 "파일에 헤더 행이 없는 경우 header=None을 명시적으로 전달해야 합니다."라고 설명합니다.이 경우 판다는 각 필드 {0,1,2,...}에 대한 정수 지수를 자동으로 생성합니다.

문서에 따르면 딜리미터는 문제가 되지 않습니다.문서에서는 "sep가 [지정되지 않음]인 경우,는 자동으로 이것을 판별하려고 합니다."라고 말합니다.그러나 나는 명확한 구분 기호가 있는 경우를 포함하여 이것에 대해 운이 좋지 않았다.

또 다른 해결책은 딜리미터 자동검출을 시도하는 것입니다.

# use the first 2 lines of the file to detect separator
temp_lines = csv_file.readline() + '\n' + csv_file.readline()
dialect = csv.Sniffer().sniff(temp_lines, delimiters=';,')

# remember to go back to the start of the file for the next time it's read
csv_file.seek(0) 

df = pd.read_csv(csv_file, sep=dialect.delimiter)

파일 헤더에 의해 파서가 혼란스러워지고 있습니다.첫 번째 행을 읽고 해당 행의 열 수를 유추합니다.그러나 처음 두 행은 파일의 실제 데이터를 나타내지 않습니다.

도 같이 해보세요.data = pd.read_csv(path, skiprows=2)

의 은 CSV 를 사용해 입니다.sep='/t' 한번 해 보세요read_csv 문자 " " " 사용(\t)separator /t.그러므로 다음 코드라인을 사용하여 엽니다.

data=pd.read_csv("File_path", sep='\t')

열 이름을 전달하지 않고 CSV로 읽으려고 하면 이 문제가 발생했습니다.

df = pd.read_csv(filename, header=None)

에 열 열 을 '열 이름'으로 했습니다.names즉시 해결되었습니다.열 이름을 설정하지 않은 경우 데이터에 있을 수 있는 최대 열 수만큼 자리 표시자 이름을 만들 수 있습니다.

col_names = ["col1", "col2", "col3", ...]
df = pd.read_csv(filename, names=col_names)

에는 다양한 과 CSV가 수 .read_csv처음 몇 개의 행에서 열 수를 유추했습니다.두 가지 할 수 있습니다.

의 첫 (1). CSV를 지정합니다.header=[0])

2) 2) 을 합니다.names = list(range(0,N))여기서 N은 열의 최대 수입니다.

나도 이 문제가 있었지만 아마 다른 이유일 것이다.CSV에는 팬더가 읽으려고 하는 컬럼을 추가하는 쉼표가 몇 개 있었습니다.다음의 사용법을 사용하면 동작합니다만, 불량 회선은 무시됩니다.

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

회선을 에러에 대처하기 위한 추악한 해킹의 일종으로 하려면 , 다음과 같은 조작을 실시합니다.

line     = []
expected = []
saw      = []     
cont     = True 

while cont == True:     
    try:
        data = pd.read_csv('file1.csv',skiprows=line)
        cont = False
    except Exception as e:    
        errortype = e.message.split('.')[0].strip()                                
        if errortype == 'Error tokenizing data':                        
           cerror      = e.message.split(':')[1].strip().replace(',','')
           nums        = [n for n in cerror.split(' ') if str.isdigit(n)]
           expected.append(int(nums[0]))
           saw.append(int(nums[2]))
           line.append(int(nums[1])-1)
         else:
           cerror      = 'Unknown'
           print 'Unknown Error - 222'

if line != []:
    # Handle the errors however you want

위 코드의 변수 'line'에 의해 불량 행이 주어지기 때문에 DataFrame에 행을 다시 삽입하는 스크립트를 작성했습니다.CSV 리더를 사용하는 것만으로 이 모든 것을 회피할 수 있습니다.바라건대 판다 개발자들이 미래에 이 상황에 대처하는 것을 더 쉽게 만들 수 있기를 바란다.

다음 사항이 도움이 되었습니다(Google Collaboratory 노트북에서 이 문제가 발생했기 때문에 이 답변을 올렸습니다).

df = pd.read_csv("/path/foo.csv", delimiter=';', skiprows=0, low_memory=False)

시험해 보세요.

data = pd.read_csv('file1.csv', sep='\t')

저도 이런 문제를 몇 번 겪었어요.대부분의 경우 열려고 했던 파일이 처음에 올바르게 저장된 CSV가 아니기 때문입니다."적절하게"라는 말은 각 행에 동일한 수의 구분 기호 또는 열이 있다는 것을 의미합니다.

일반적으로 CSV를 Excel로 열고 잘못 저장했기 때문에 발생합니다.파일 확장자는 아직 .csv이지만 순수 CSV 형식은 변경되었습니다.

panda to_csv와 함께 저장된 모든 파일은 올바른 포맷이 되며 이러한 문제는 발생하지 않습니다.그러나 다른 프로그램으로 열면 구조가 변경될 수 있습니다.

도움이 됐으면 좋겠다.

저도 같은 문제에 부딪혔어요.「」를 사용합니다.pd.read_table()동작하는 것 같았습니다.그 이유를 추적할 수는 없었지만, 제 경우 유용한 해결 방법이 되었습니다.아마도 좀 더 박식한 누군가가 왜 그것이 효과가 있었는지 더 밝힐 수 있을 것이다.

편집: 파일에 실제 데이터와 형식이 다른 텍스트가 있을 때 이 오류가 발생합니다.이는 보통 헤더 또는 바닥글 정보입니다(한 줄 이상이므로 skip_header는 작동하지 않습니다). 실제 데이터와 동일한 수의 쉼표로 구분되지 않습니다(read_csv 사용 시).read_table을 사용하면 사용자의 현재 오류를 회피할 수 있지만 다른 오류가 발생할 수 있는 구분 기호로 탭이 사용됩니다.

저는 보통 추가 데이터를 파일로 읽고 read_csv() 메서드를 사용하여 이 문제를 해결합니다.

실제 파일에 따라 정확한 해결 방법이 다를 수 있지만, 이 방법은 몇 가지 경우에 효과가 있었습니다.

공백, 쉼표 및 따옴표로 구분된 탭 구분 표를 읽으려고 할 때 비슷한 문제가 발생했습니다.

1115794 4218    "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", ""
1144102 3180    "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", "g__Bacillus", ""
368444  2328    "k__Bacteria", "p__Bacteroidetes", "c__Bacteroidia", "o__Bacteroidales", "f__Bacteroidaceae", "g__Bacteroides", ""



import pandas as pd
# Same error for read_table
counts = pd.read_csv(path_counts, sep='\t', index_col=2, header=None, engine = 'c')

pandas.io.common.CParserError: Error tokenizing data. C error: out of memory

이는 C 해석 엔진(기본값)과 관련이 있음을 나타냅니다.이든 .

counts = pd.read_table(path_counts, sep='\t', index_col=2, header=None, engine='python')

Segmentation fault (core dumped)

츠키다
테이블에서 공간을 삭제하려고 하면 python-engine 오류가 다시 변경됩니다.

1115794 4218    "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae",""
1144102 3180    "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae","g__Bacillus",""
368444  2328    "k__Bacteria","p__Bacteroidetes","c__Bacteroidia","o__Bacteroidales","f__Bacteroidaceae","g__Bacteroides",""


_csv.Error: '   ' expected after '"'

그리고 판다가 우리 줄을 해석하는데 문제가 있었음이 분명해졌습니다.python 엔진으로 테이블을 해석하려면 사전에 테이블에서 공백과 따옴표를 모두 삭제해야 했습니다.한편 C엔진은 쉼표가 줄지어 있어도 계속 충돌했다.

않기 때문에 .

from io import StringIO
with open(path_counts) as f:
    input = StringIO(f.read().replace('", ""', '').replace('"', '').replace(', ', ',').replace('\0',''))
    counts = pd.read_table(input, sep='\t', index_col=2, header=None, engine='python')

;dr;dr
구문 분석 엔진을 변경하고 데이터에 구분되지 않는 따옴표/쉼표/스페이스를 사용하지 않도록 합니다.

매개 변수에 구분 기호 사용

pd.read_csv(filename, delimiter=",", encoding='utf-8')

읽을 거예요.

제가 사용한 데이터 세트에는 형식과 무관하게 따옴표(")가 많이 사용되었습니다.으로써 오류를 할 수 .read_csv():

quoting=3 # 3 correlates to csv.QUOTE_NONE for pandas

Linux OS의 Python 3에서 유사한 문제를 겪고 있는 사용자를 위해.

pandas.errors.ParserError: Error tokenizing data. C error: Calling
read(nbytes) on source failed. Try engine='python'.

시험:

df.read_csv('file.csv', encoding='utf8', engine='python')

제가 알기로는, 그리고 당신의 파일을 살펴본 결과, 로딩하려는 csv 파일에 여러 개의 테이블이 있는 것이 문제입니다.빈 행 또는 테이블 제목을 포함하는 행이 있습니다. Stackoverflow 응답을 확인해 보십시오.그것은 어떻게 그것을 실현하는지를 프로그램적으로 보여준다.

이를 위한 또 다른 동적 접근법은 csv 모듈을 사용하여 한 번에 모든 행을 읽고 건전성 검사/정규식을 수행하여 행이 (title/header/values/blank)인지 유추하는 것입니다.이 접근방식을 사용하면 필요에 따라 python 객체의 데이터를 분할/추가/수집할 수 있다는 장점이 하나 더 있습니다.

의 기능을 입니다.pd.read_clipboard()수동으로 테이블을 선택하여 클립보드에 복사한 후 csv를 Excel로 열 수 있는지 확인합니다.

관련 없음:

또한 아무도 에 대해 언급하지 않았기 때문에 귀하의 문제와 무관합니다.UCI에서와 같은 일부 데이터 세트를 로드할 때도 이와 같은 문제가 발생했습니다.내 경우 일부 구분자에 실제 탭보다 더 많은 공백이 있기 때문에 오류가 발생했습니다.\t. 예를 들어 다음 줄 3을 참조하십시오.

14.38   14.21   0.8951  5.386   3.312   2.462   4.956   1
14.69   14.49   0.8799  5.563   3.259   3.586   5.219   1
14.11   14.1    0.8911  5.42    3.302   2.7     5       1

따라서,\t+대신 세퍼레이터 패턴으로\t.

data = pd.read_csv(path, sep='\t+`, header=None)

데이터를 토큰화하는 중 오류가 발생했습니다.C 오류: 줄 3에 2개의 필드가 있어야 하며 12개가 표시되었습니다.

이 에러는, 「3행의 예상 2 필드, 톱 12」의 문제를 해결할 수 있는 힌트를 제공합니다.톱 12는 두 번째 행의 길이가 12이고 첫 번째 행은 2입니다.

다음과 같은 데이터가 있는 경우 행을 건너뛰면 대부분의 데이터가 건너뜁니다.

data = """1,2,3
1,2,3,4
1,2,3,4,5
1,2
1,2,3,4"""

행을 건너뛰지 않으려면 다음을 수행하십시오.

#First lets find the maximum column for all the rows
with open("file_name.csv", 'r') as temp_f:
    # get No of columns in each line
    col_count = [ len(l.split(",")) for l in temp_f.readlines() ]

### Generate column names  (names will be 0, 1, 2, ..., maximum columns - 1)
column_names = [i for i in range(max(col_count))] 

import pandas as pd
# inside range set the maximum value you can see in "Expected 4 fields in line 2, saw 8"
# here will be 8 
data = pd.read_csv("file_name.csv",header = None,names=column_names )

열이 많으면 번거로우므로 이름을 수동으로 설정하지 말고 범위를 사용하십시오.

또한 짝수 데이터 길이를 사용해야 하는 경우 NaN 값을 0으로 채울 수 있습니다.예: 군집 분석(k-평균)

new_data = data.fillna(0)

난 해결책을 믿어

,engine='python'
, error_bad_lines = False

더미 컬럼이고 삭제할 경우 좋습니다.제 경우에는 두 번째 행에 열이 더 많았는데, 이 열을 통합하고 열 수를 = MAX(열)로 설정하려고 했습니다.

어디에서도 읽을 수 없었던 아래의 솔루션을 참조해 주세요.

try:
    df_data = pd.read_csv(PATH, header = bl_header, sep = str_sep)
except pd.errors.ParserError as err:
    str_find = 'saw '
    int_position = int(str(err).find(str_find)) + len(str_find)
    str_nbCol = str(err)[int_position:]
    l_col = range(int(str_nbCol))
    df_data = pd.read_csv(PATH, header = bl_header, sep = str_sep, names = l_col)

이 질문에는 해당되지 않지만 압축된 데이터에서도 이 오류가 나타날 수 있습니다.값을 명시적으로 설정하다kwarg compression문제를 해결했습니다.

result = pandas.read_csv(data_source, compression='gzip')

이 경우 구분 기호는 기본 " "가 아니라 Tab이었습니다.

pd.read_csv(file_name.csv, sep='\\t',lineterminator='\\r', engine='python', header='infer')

주의: "\t"는 일부 소스의 제안대로 작동하지 않았습니다."\\t"는 필수입니다.

저는 이 문제에 대해 여러 가지 해결책을 찾았습니다.많은 사람들이 그 대답에 대해 가장 좋은 설명을 해주었다.그러나 초보자에게는 아래의 두 가지 방법으로 충분하다고 생각합니다.

import pandas as pd

#Method 1

data = pd.read_csv('file1.csv', error_bad_lines=False)
#Note that this will cause the offending lines to be skipped.

#Method 2 using sep

data = pd.read_csv('file1.csv', sep='\t')

때때로 문제는 python을 사용하는 방법이 아니라 raw data에 있습니다.
이 에러 메세지가 표시되었습니다.

Error tokenizing data. C error: Expected 18 fields in line 72, saw 19.

컬럼 설명에 쉼표가 있는 경우가 있음이 판명되었습니다.즉, CSV 파일을 청소하거나 다른 구분자를 사용해야 합니다.

유사한 해석 오류를 처리하는 데 유용한 대안으로 CSV 모듈을 사용하여 데이터를 팬더 df로 재루팅합니다.예를 들어 다음과 같습니다.

import csv
import pandas as pd
path = 'C:/FileLocation/'
file = 'filename.csv'
f = open(path+file,'rt')
reader = csv.reader(f)

#once contents are available, I then put them in a list
csv_list = []
for l in reader:
    csv_list.append(l)
f.close()
#now pandas has no problem getting into a df
df = pd.DataFrame(csv_list)

CSV 모듈은 형식이 잘못된 쉼표로 구분된 파일에 대해 조금 더 견고하기 때문에 이러한 문제에 대처하는 데 성공했습니다.

다음 일련의 명령어가 작동합니다(데이터의 첫 번째 행이 손실됩니다. -no header=None present- 하지만 적어도 로드됩니다).

df = pd.read_csv(filename, usecols=range(0, 42)) df.columns = ['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND', 'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS', 'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2', 'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6', 'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10', 'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14']

다음 기능은 작동하지 않습니다.

df = pd.read_csv(filename, names=['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND', 'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS', 'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2', 'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6', 'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10', 'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14'], usecols=range(0, 42))

CParserError: 데이터 토큰화 중 오류가 발생했습니다.C 오류: 1605634 행에 53개의 필드가 있어야 합니다. 54개의 다음 항목은 작동하지 않습니다.

df = pd.read_csv(filename, header=None)

CParserError: 데이터 토큰화 중 오류가 발생했습니다.C 오류: 1605634 행에 53개의 필드가 있어야 합니다. 54개의 필드가 표시되었습니다.

때문에 이 에서는 꼭 합격해야 .usecols=range(0, 2)

심플한 해상도:csv 파일을 Excel로 열고 csv 형식의 다른 이름 파일로 저장합니다.다시 스파이더를 가져오십시오. 문제가 해결됩니다!

pandas.read_csv('CSVFILENAME',header=None,sep=', ')

링크에서 csv 데이터를 읽으려고 할 때

http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data

사이트에서 csv 파일로 데이터를 복사했습니다.여백이 있어서 sep =' , ' 를 사용했고, 동작했습니다: )

나는 이것과 비슷한 케이스와 세팅이 있었다.

train = pd.read_csv('input.csv' , encoding='latin1',engine='python') 

일했다

기존 행 번호가 있는 데이터 세트가 있어서 index_col을 사용했습니다.

pd.read_csv('train.csv', index_col=0)

이게 내가 한 일이야.

sep='::'문제를 해결했습니다.

data=pd.read_csv('C:\\Users\\HP\\Downloads\\NPL ASSINGMENT 2 imdb_labelled\\imdb_labelled.txt',engine='python',header=None,sep='::')

read_csv:ParserError:Error:데이터 토큰화 오류 시 동일한 문제가 발생합니다.오래된 csv 파일을 새로운 csv 파일에 저장했습니다.문제가 해결됐어!

언급URL : https://stackoverflow.com/questions/18039057/python-pandas-error-tokenizing-data

반응형