2012-10-05 13 views
9

Ich versuche, eine CSV-Datei zu importieren, diesen Code verwenden:UnicodeDecodeError in Python 3, wenn eine CSV-Datei importieren

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:]) 

Hier ist eine Probe meiner CSV-Datei:

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

Und der Fehler :

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) 

Offensichtlich ist es am Ende des CSV den Charakter trifft und diesen Fehler zu werfen, aber ich bin ratlos, wie diese zu beheben . Irgendeine Hilfe?

Dies ist:

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

Antwort

10

Es scheint, Ihr Problem läuft darauf hinaus:

print("α") 

Sie können das Problem beheben, indem PYTHONIOENCODING Angabe:

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

Hinweis:

$ python3 test.py 

sollte funktionieren wie es ist, wenn Sie r Terminalkonfiguration unterstützt, wo test.py:

import csv 

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

Wenn open() hat keine encoding Parameter oben dann werden Sie UnicodeDecodeError mit LC_ALL=C bekommen.

Auch mit LC_ALL=C erhalten Sie UnicodeEncodeError, auch wenn es keine Umleitung gibt, d. H. PYTHONIOENCODING ist in diesem Fall erforderlich.

10

Vom python docs haben Sie die Codierung für die Datei zu setzen. Hier ist ein Beispiel von der Website:

import csv 

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

Bearbeiten: Ihr Problem scheint mit dem Drucken passieren. Versuchen Sie es mit ziemlich Drucker:

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

die Codierung für die Datei Einstellung hat nichts, um das Problem zu beheben ... 'file = open (Dateiname, 'r', encoding = 'utf-8')' noch gibt mir 'UnicodeDecodeError: 'ascii' Codec kann Byte 0xce an Position 40 nicht dekodieren: Ordnungszahl nicht im Bereich (128) ' –

+0

Ah, es hat damit zu tun, dass' print' keine Unicode-Zeichen darstellen kann. Diese Frage auf Quora kann die Antwort haben - es verwendet einen hübschen Drucker: http://www.quora.com/How-do-you-print-a-python-unicode-data-structure – TheDude

+1

Ich denke, der Fehler hat nichts zu tun mache mit dem Druck überhaupt. Es trifft den Fehler am Anfang der for-Schleife, bevor der Ausdruck() sogar ausgeführt wird. Ihr bearbeiteter Beispielcode mit pprint liefert den gleichen Fehler wie zuvor, was diesen Anspruch weiter verstärkt. Ich bin ratlos. –

Verwandte Themen