>

큰 CSV 파일을 읽고 있습니다

df = pd.read_csv(filename, sep=';',
                 encoding='cp850', quoting=3)

일부 줄에는 여분의 세미콜론으로 인해 오류 메시지가 나타납니다

Error tokenizing data. C error: 
Expected 33 fields in line 23836, saw 34

Vim에서 파일을 열 때 대부분의 경우 오류는 정확히이 줄에 있습니다. 그러나 때때로이 줄 번호가 아니라 위의 줄/몇 줄입니다.

줄을 수동으로 검색하면 편집기에서 오류를 찾은 줄 번호 인 다른 줄 번호를 얻습니다.

with open(filename, encoding='cp850') as f1:
    lines = f1.readlines()
    [(e, l) for e, l in enumerate(lines) 
        if len(split(';')) == 34]

결과

[(23835, '.....

이 예에서 오류는 23836 행이 아니라 23835입니다.

이 문제는 read_csv의 c와 python 엔진 모두에서 발생합니다.

read_csv가 오류 메시지와 함께 오류 행 내용을 표시 할 수 있으면 매우 유용합니다.

이 작업을 수행 할 방법이 있습니까?

업데이트 :

가져 오기 파일의 행 내에 줄 바꿈이있는 것으로 보이며 한 줄이 두 줄로 나뉘어지면 read_csv가 해당 줄을 올바른 것으로 받아 들여서 33 개의 필드 뒤에 항상 줄 바꿈이있는 것 같습니다. 그러나 그 줄부터 오류 메시지의 줄 수는 더 이상 파일의 줄 바꿈과 일치하지 않습니다.


  • 답변 # 1

    오류가있는 줄은 csv 파일의 23836 번째 줄이며, 파이썬은 0으로 인덱스되므로 파이썬에서 열거 될 때 인덱스 23835를 갖습니다.

    그러나 오류의 정확한 원인은 무엇입니까?
    하나 이상의 세미콜론이에있는 줄에 관한 것이라면 처음 33 개 열을 명시 적으로 읽어서 쉽게 버릴 수 있습니다.

    df = pd.read_csv(filename, sep=';', usecols=range(33), encoding='cp850', quoting=3)
    
    

  • 답변 # 2

    불량한 줄 23835 ± 2 줄 아래에서 익명화 된 데이터로 샘플 파일을 만듭니다 :

    import re
    bad_idx = 23835
    with open(filename, 'r') as f_in, open(filename[-4:] + '_dummy.csv', 'w') as f_out:
        for i, line in enumerate(f_in):
            line = re.sub('[a-zA-Z0-9]+', line)
            if (i > bad_idx-3) and (i < bad_idx+3) or i==0:
                f_out.write(line)
    
    
    <시간>

    불량한 줄과 줄 번호 목록 (1부터 시작) :

    bad_lines = []
    with open(filename, 'r') as f:
        n_col = len(f.readline().split(';'))
        for i, line in enumerate(f):
            if len(line.split(';')) != n_col:
                print(i+2, line)
                bad_lines.append(i+2)
    print(bad_lines)
    
    

관련 자료

  • 이전 Data Studio에 Google 스프레드 시트 수식 결과가 표시되지 않습니다
  • 다음 python - django-mptt의 MPTTModel 상속 문제