2012-10-05 3 views
9

Sto cercando di importare un file CSV, utilizzando questo codice:UnicodeDecodeError in Python 3 durante l'importazione di un file 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:]) 

Ecco un esempio del mio file CSV:

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

e l'errore :

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) 

Ovviamente, è colpire il carattere alla fine del CSV e gettando questo errore, ma io sono in perdita quanto a come risolvere il problema . Qualsiasi aiuto?

Questo è:

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

risposta

10

Sembra il problema si riduce a:

print("α") 

Si potrebbe risolvere il problema specificando PYTHONIOENCODING:

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

Nota:

$ python3 test.py 

dovrebbe funzionare come è se tu configurazione del terminale R supporta, dove test.py:

import csv 

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

Se open() ha nessun parametro encoding sopra, allora si otterrà UnicodeDecodeError con LC_ALL=C.

Inoltre con LC_ALL=C si otterrà UnicodeEncodeError anche se non vi è alcun reindirizzamento, ad esempio, in questo caso è necessario PYTHONIOENCODING.

10

Dal python docs, è necessario impostare la codifica del file. Ecco un esempio dal sito:

import csv 

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

Modifica: il problema sembra verificarsi con la stampa. Provate ad usare abbastanza stampante:

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

L'impostazione della codifica per il file non risolve il problema ... 'file = open (nome file, 'r', encoding = 'utf-8')' mi dà ancora 'UnicodeDecodeError: 'ascii' codec non può decodificare il byte 0xce nella posizione 40: ordinale non nel range (128) ' –

+0

Ah, ha a che fare con' print' che non è in grado di mostrare caratteri unicode. Questa domanda su Quora potrebbe avere la risposta - utilizza una stampante carina: http://www.quora.com/How-do-you-print-a-python-unicode-data-structure – TheDude

+1

Penso che l'errore non abbia nulla da fare con la stampa a tutti. Sta colpendo l'errore all'inizio del ciclo for, prima che anche print() venga eseguito. Il codice di esempio modificato utilizzando pprint produce lo stesso errore di prima, rafforzando ulteriormente questo reclamo. Sono perplesso. –