csv.Error : 반복자는 바이트가 아닌 문자열을 반환해야합니다


158

Sample.csv는 다음을 포함합니다.

NAME    Id   No  Dept
Tom     1    12   CS
Hendry  2    35   EC
Bahamas 3    21   IT
Frank   4    61   EE

그리고 파이썬 파일에는 다음 코드가 포함되어 있습니다.

import csv
ifile  = open('sample.csv', "rb")
read = csv.reader(ifile)
for row in read :
    print (row) 

파이썬에서 위의 코드를 실행하면 다음 예외가 발생합니다.

_csv.Error : 반복자가 바이트가 아닌 문자열을 반환해야합니다 (텍스트 모드에서 파일을 열었습니까?).

어떻게 고칠 수 있습니까?

답변:


214

텍스트 모드에서 파일을 엽니 다.

더 구체적으로:

ifile  = open('sample.csv', "rt", encoding=<theencodingofthefile>)

인코딩에 대한 추측은 "ascii"와 "utf8"입니다. 인코딩을 해제 한 상태로 둘 수도 있으며 시스템 기본 인코딩을 사용합니다.이 인코딩은 UTF8 인 경향이 있지만 다른 것일 수 있습니다.


4
CSV 파일에서 읽고 쓸 때 인코딩 오류가 발생하면 특정 인코딩을 추가하면 도움이 될 수 있습니다. 방금 "encoding = 'utf-8'"을 추가하여이 버그를 수정했습니다.
covfefe

96

방금 코드 로이 문제를 해결했습니다. 예외가 발생하는 이유는 인수가 있기 때문 rb입니다. 로 변경하십시오 r.

귀하의 코드 :

import csv
ifile  = open('sample.csv', "rb")
read = csv.reader(ifile)
for row in read :
    print (row) 

새로운 코드 :

import csv
ifile  = open('sample.csv', "r")
read = csv.reader(ifile)
for row in read :
    print (row)

29

문제는 당신이이입니다 bopen플래그. 플래그 rt(읽기, 텍스트)가 기본값이므로 컨텍스트 관리자를 사용하여 간단히 다음을 수행하십시오.

with open('sample.csv') as ifile:
    read = csv.reader(ifile) 
    for row in read:
        print (row)  

컨텍스트 관리자는 일반적인 오류 처리가 필요하지 않음을 의미합니다 (특히 인터프리터에서 파일을 연 상태에서 파일이 열리지 않으면 오류가 발생하거나 컨텍스트를 종료 할 때 파일이 자동으로 닫히므로).

위와 동일합니다 :

with open('sample.csv', 'r') as ifile:
    ...

또는

with open('sample.csv', 'rt') as ifile:
    ...

with컨텍스트 매니저 일명 문은 모두에서,이 문제와 아무 상관이있다!
RayLuo

4
@RayLuo 파일 처리를 시연 할 때, 그와 관련된 모범 사례도 시연 할 것입니다. 나는 그것을 상당히 일관되게한다. 파이썬을 처음 접하고 아무 것도 할 수없는 파일로 대화 형 세션에 갇힌다면 내 충고에 감사 할 것이다.
Aaron Hall

24

Python3에서는 csv.readeriterable에 전달 된 것이 바이트가 아닌 문자열을 반환한다고 예상합니다. 이 문제에 대한 또 다른 해결책은 다음과 같습니다 codecs.

import csv
import codecs
ifile  = open('sample.csv', "rb")
read = csv.reader(codecs.iterdecode(ifile, 'utf-8'))
for row in read :
    print (row) 

3
이 옵션은 가장 안전하지 않습니다. TextIOWrapper를 사용할 수 있다면해야합니다. 이슈 설명 : iterdecode은 빈 문자열 먹는 iterdecode 멀티 바이트 문자에 안전하지 않습니다 :이 솔루션 TextIOWrapper를 CSV 스트림
kavdev

1
감사! Python3 에서이 문제에 직면했습니다.
Kenny Aires

9

Python 2.6.4로 개발 된 오래된 Python 스크립트를 실행할 때이 오류가 발생했습니다.

3.6.2로 업데이트 할 때이 CSV 읽기 오류를 수정하기 위해 열린 호출에서 모든 'rb'매개 변수를 제거해야했습니다 .

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