2012-10-05 60 views
9

Estoy tratando de importar un archivo CSV, utilizando este código:UnicodeDecodeError en Python 3 al importar un archivo CSV

import csv 
    import sys 

    def load_csv(filename): 
     # Open file for reading 
     file = open(filename, 'r') 

     # Read in file 
     return csv.reader(file, delimiter=',', quotechar='\n') 

    def main(argv): 
     csv_file = load_csv("myfile.csv") 

     for item in csv_file: 
      print(item) 

    if __name__ == "__main__": 
     main(sys.argv[1:]) 

He aquí una muestra de mi archivo csv:

foo,bar,test,1,2 
    this,wont,work,because,α 

y el error :

Traceback (most recent call last): 
     File "test.py", line 22, in <module> 
     main(sys.argv[1:]) 
     File "test.py", line 18, in main 
     for item in csv_file: 
     File "/usr/lib/python3.2/encodings/ascii.py", line 26, in decode 
     return codecs.ascii_decode(input, self.errors)[0] 
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 40: ordinal not in range(128) 

Obviamente, es golpear el carácter al final de la CSV y tirar ese error, pero estoy en una pérdida en cuanto a cómo solucionar este problema . ¿Alguna ayuda?

Esto es:

Python 3.2.3 (default, Apr 23 2012, 23:35:30) 
    [GCC 4.7.0 20120414 (prerelease)] on linux2 

Respuesta

10

Parece que su problema se reduce a:

print("α") 

Usted podría fijarlo mediante la especificación de PYTHONIOENCODING:

$ PYTHONIOENCODING=utf-8 python3 test.py > output.txt 

Nota:

$ python3 test.py 

debería funcionar como es si r configuración del terminal lo soporta, donde test.py:

import csv 

with open('myfile.csv', newline='', encoding='utf-8') as file: 
    for row in csv.reader(file): 
     print(row) 

Si open() tiene ningún parámetro encoding anterior, entonces obtendrá UnicodeDecodeError con LC_ALL=C.

También con LC_ALL=C obtendrá UnicodeEncodeError incluso si no hay redirección, es decir, PYTHONIOENCODING es necesario en este caso.

10

Desde el python docs, usted tiene que definir la codificación del archivo. Aquí hay un ejemplo del sitio:

import csv 

with open('some.csv', newline='', encoding='utf-8') as f: 
    reader = csv.reader(f) 
    for row in reader: 
    print(row) 

Editar: Su problema parece ocurrir con la impresión. Trate de usar bastante impresora:

import csv 
import pprint 

with open('some.csv', newline='', encoding='utf-8') as f: 
    reader = csv.reader(f) 
    for row in reader: 
    pprint.pprint(row) 
+1

Establecer la codificación para el archivo no soluciona el problema ... 'file = open (filename, 'r', encoding = 'utf-8')' todavía me da 'UnicodeDecodeError: 'ascii' codec no se puede decodificar byte 0xce en posición 40: ordinal no en rango (128) ' –

+0

Ah, tiene que ver con' print' que no puede mostrar caracteres unicode. Esta pregunta sobre Quora puede tener la respuesta: utiliza una linda impresora: http://www.quora.com/How-do-you-print-a-python-unicode-data-structure – TheDude

+1

Creo que el error no tiene nada que ver con hacer con la impresión en absoluto. Está llegando al error al principio del ciclo for, antes de que se ejecute la impresión(). Su código de muestra editado utilizando pprint produce el mismo error que antes, lo que refuerza aún más este reclamo. Estoy perplejo. –

Cuestiones relacionadas