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

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 : 반복자가 바이트가 아닌 문자열을 반환해야합니다 (텍스트 모드에서 파일을 열었습니까?).

어떻게 고칠 수 있습니까?



답변

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

더 구체적으로:

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

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


답변

방금 코드 로이 문제를 해결했습니다. 예외가 발생하는 이유는 인수가 있기 때문 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)


답변

문제는 당신이이입니다 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:
    ...


답변

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) 


답변

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

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


답변