programing

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

mailnote 2023. 5. 11. 21:43
반응형

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

Sample.csv에는 다음이 포함됩니다.

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

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

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

Python에서 위의 코드를 실행하면 다음과 같은 예외가 발생합니다.

파일 "csvformat.py ", 4행, 읽기: _csv 행.오류: 반복기는 바이트가 아닌 문자열을 반환해야 합니다(파일을 텍스트 모드로 열었습니까?).

어떻게 고칠 수 있습니까?

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

더 구체적으로 말하면:

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

인코딩은 "asci"와 "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)

Python3에서csv.reader바이트가 아닌 문자열을 반환합니다.이 문제에 대한 또 다른 해결책은 다음과 같습니다.codecs모듈:

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

당신의 문제는 당신이 가지고 있다는 것입니다.b에서open깃발. 깃발.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:
    ...

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

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

여기는 짱고 GOTCHA입니다.파일 필드와 함께 제공되는 열기는 항상 바이트 모드로 파일을 엽니다.당신은 대신 파이썬의 오픈으로 열어야 합니다.

따라서 vccont_datafile은 datafile = django.db.db.dll이라는 필드를 가진 모델의 인스턴스입니다.FileField(), 다음 코드...

with avccount_datafile.datafile.file.open('rt') as fp:
    self.avc_data = csv.DictReader(fp)

오류를 제공합니다.

_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

하지만 이것으로 해결됩니다.

filename = avccount_datafile.datafile.file.name
with open(filename, 'rt') as fp:
        self.avc_data = csv.DictReader(fp)

언급URL : https://stackoverflow.com/questions/8515053/csv-error-iterator-should-return-strings-not-bytes

반응형