2012-10-05 13 views
9

próbuję zaimportować plik CSV, używając tego kodu:UnicodeDecodeError w Pythonie 3 podczas importowania pliku 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:]) 

Oto próbka mojego pliku csv:

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

a błąd :

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) 

Oczywiście, to uderzanie znak na końcu pliku CSV i rzuca ten błąd, ale jestem ze stratą, jak to naprawić . Jakaś pomoc?

to:

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

Odpowiedz

10

Wydaje problem sprowadza się do:

print("α") 

Można to naprawić poprzez określenie PYTHONIOENCODING:

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

Uwaga:

$ python3 test.py 

powinien działać tak, jak jest, jeśli Ty Konfiguracja terminala r wspiera go, gdzie test.py:

import csv 

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

Jeśli open() ma nad czym nie parametr encoding dostaniesz UnicodeDecodeError z LC_ALL=C.

Również z LC_ALL=C otrzymasz UnicodeEncodeError, nawet jeśli nie ma przekierowania, tj. PYTHONIOENCODING jest w tym przypadku konieczne.

10

Z python docs, trzeba ustawić kodowanie pliku. Oto przykład ze strony:

import csv 

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

Edytuj: Twój problem pojawia się przy drukowaniu. Spróbuj użyć ładny drukarkę:

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

Ustawianie kodowania dla pliku nie robi nic, aby rozwiązać ten problem ... 'plik = open (filename, 'r' encoding = 'UTF-8') wciąż daje mi' 'UnicodeDecodeError: 'ascii' codec nie może dekodować bajtu 0xce w pozycji 40: porządkowy nie w zakresie (128) ' –

+0

Ah, ma to związek z' print' nie mogącym wyświetlać znaków unicode. To pytanie na Quora może mieć odpowiedź - używa ładnej drukarki: http://www.quora.com/How-do-you-print-a-python-unicode-data-structure – TheDude

+1

Myślę, że błąd nie ma nic wspólnego z Zrób z wydrukiem w ogóle. Występuje błąd na początku pętli for, zanim print() zostanie uruchomiony. Zmieniony przykładowy kod wykorzystujący pprint daje taki sam błąd jak poprzednio, co dodatkowo wzmocni to roszczenie. Jestem zaskoczony. –

Powiązane problemy