2011-12-15 14 views
77

Sample.csv contiene la siguientecsv.Error: iterador debe devolver cadenas, no bytes

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

y el archivo de 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, Tengo la siguiente excepción

File "csvformat.py", line 4, in for row in read : _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

¿Cómo puedo arreglarlo?

Respuesta

114

Abre el archivo en modo de texto.

Más específicamente:

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

buenas conjeturas para la codificación es "ASCII" y "UTF-8". También puede dejar la codificación desactivada y usará la codificación predeterminada del sistema, que tiende a ser UTF8, pero puede ser otra cosa.

+2

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

10

Tu problema es que tienes el b en la bandera de open. La bandera rt (leer, texto) es el valor por defecto, por lo que, mediante el gestor de contexto, sólo tiene que hacer esto:

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

El gestor de contexto significa que no es necesario el manejo de error genérico (sin la cual es posible que se atascan con el archivo abierto, especialmente en un intérprete), ya que 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: 
    ... 
41

que acaba de arreglar este problema con mi código. La razón por la que arroja esa excepción es porque tiene el argumento rb. Cambie eso al r.

Su código:

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) 
3

tuve este error cuando se ejecuta un viejo script en Python, desarrollado con Python 2.6.4

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

Cuestiones relacionadas