Csv.Error: итератор должен возвращать строки, а не байты

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.Error: iterator должен возвращать строки, а не байты (вы открыли файл в текстовом режиме?)

Как я могу это исправить?

Ответ 1

Вы открываете файл в текстовом режиме.

Более конкретно:

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

Хорошими предположениями для кодирования являются "ascii" и "utf8". Вы также можете оставить кодировку выключенной, и она будет использовать кодировку по умолчанию системы, которая имеет тенденцию быть UTF8, но может быть чем-то еще.

Ответ 2

Я просто исправил эту проблему с помощью моего кода. Причина, по которой это исключение, заключается в том, что у вас есть аргумент 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)

Ответ 3

У вас проблема с 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:
    ...

Ответ 4

У меня была эта ошибка при запуске старого python script, разработанного с помощью Python 2.6.4

При обновлении до 3.6.2 мне пришлось удалить все параметры "rb" из вызовов open, чтобы исправить эту ошибку чтения csv.