csv.Error: el iterador debe devolver cadenas, no bytes

159

Sample.csv contiene lo siguiente:

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

Y el archivo Python contiene el siguiente código:

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

Cuando ejecuto el código anterior en Python, obtengo la siguiente excepción:

Archivo "csvformat.py", línea 4, para fila en lectura: _csv.Error: el iterador debe devolver cadenas, no bytes (¿abrió el archivo en modo texto?)

¿Cómo puedo arreglarlo?

Pika el mago de las ballenas
fuente

Respuestas:

215

Abre el archivo en modo de texto.

Más específicamente:

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

Las buenas suposiciones para la codificación son "ascii" y "utf8". También puede dejar la codificación desactivada, y utilizará la codificación predeterminada del sistema, que tiende a ser UTF8, pero puede ser otra cosa.

Lennart Regebro
fuente
44
Solo quiero agregar a esto que si obtiene errores de codificación cuando intenta leer / escribir desde / a un archivo CSV, agregar una codificación particular puede ayudar. Acabo de corregir este error en el mío agregando "encoding = 'utf-8'".
covfefe
96

Acabo de solucionar este problema con mi código. La razón por la que está lanzando esa excepción es porque tienes el argumento rb. Cambia eso a r.

Tu codigo:

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

Nuevo código:

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

Su problema es que tiene el ben la openbandera. El indicador rt(lectura, texto) es el predeterminado, así que, usando el administrador de contexto, simplemente haga esto:

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

El administrador de contexto significa que no necesita un manejo genérico de errores (sin el cual puede quedar atrapado con el archivo abierto, especialmente en un intérprete), porque cerrará automáticamente el archivo en caso de error o al salir del contexto.

Lo anterior es lo mismo que:

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

o

with open('sample.csv', 'rt') as ifile:
    ...
Aaron Hall
fuente
¡La withdeclaración, también conocida como el administrador de contexto, no tiene nada que ver con esta pregunta, en absoluto!
RayLuo
44
@RayLuo Cuando demuestre el manejo de archivos, también mostraré las mejores prácticas a su alrededor. Lo hago de manera bastante consistente. Si eres nuevo en Python y te quedas atascado en una sesión interactiva con un archivo con el que no puedes hacer nada, habrías apreciado mi consejo ...
Aaron Hall
24

En Python3, se csv.readerespera que el paso iterativo devuelva cadenas, no bytes. Aquí hay una solución más para este problema, que utiliza el codecsmódulo:

import csv
import codecs
ifile  = open('sample.csv', "rb")
read = csv.reader(codecs.iterdecode(ifile, 'utf-8'))
for row in read :
    print (row) 
Grigoriy Mikhalkin
fuente
3
Tenga en cuenta que esta opción no es la más segura. Si puede usar TextIOWrapper, debería hacerlo. Descripciones de problemas: iterdecode come cadenas vacías iterdecode no es seguro con caracteres de varios bytes La solución: TextIOWrapper en una transmisión csv
kavdev
1
¡Gracias! estaba enfrentando este problema en Python3.
Kenny Aires
9

Tuve este error al ejecutar un antiguo script de Python desarrollado con Python 2.6.4

Al actualizar a 3.6.2, tuve que eliminar todos los parámetros 'rb' de las llamadas abiertas para corregir este error de lectura de csv.

Michael Fayad
fuente