2015-10-05 17 views
5

Nie jestem całkowicie pewien, co muszę zrobić w związku z tym błędem. Zakładałem, że miało to związek z koniecznością dodania .encode ("utf-8"). Ale nie jestem do końca pewien, czy to jest to, co muszę zrobić, ani gdzie powinienem to zastosować.Kodek ASCII w języku Python nie może kodować błędu znaku podczas zapisu do pliku CSV

Błąd jest:

line 40, in <module> 
writer.writerows(list_of_rows) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in position 1 
7: ordinal not in range(128) 

To jest podstawa mojego skryptu Pythona.

Odpowiedz

15

Python 2.x Biblioteka CSV jest zepsuta. Masz trzy opcje. W celu skomplikowania:

  1. Edycja: Patrz niżej użytkowania środków biblioteki https://github.com/jdunck/python-unicodecsv ( pip install unicodecsv). Zastosowanie jako zamiennik - na przykład:

    with open("myfile.csv", 'rb') as my_file:  
        r = unicodecsv.DictReader(my_file, encoding='utf-8') 
    

  1. Czytaj obsługi CSV odniesieniu Unikodu: https://docs.python.org/2/library/csv.html (patrz przykłady z dołu)

  2. ręcznie kodować każdą pozycję jako UTF-8

    for cell in row.findAll('td'): 
        text = cell.text.replace('[','').replace(']','') 
        list_of_cells.append(text.encode("utf-8")) 
    

Edit znalazłem python-unicodecsv jest również uszkodzony podczas odczytu UTF-16. Narzeka na wszelkie bajty o wartości 0x00.

Zamiast używać https://github.com/ryanhiebert/backports.csv, która bardziej przypomina Python 3 Wykonanie i wykorzystuje moduł io ..

Instalacja:

pip install backports.csv 

Zastosowanie:

from backports import csv 
import io 

with io.open(filename, encoding='utf-8') as f: 
    r = csv.reader(f): 
+0

oh wow nie wiedziałem, że biblioteka CSV została uszkodzona w pythonie. Dziękuję Ci bardzo! To ogromna pomoc. – paintball247

+2

Dlaczego to nie jest wystarczająco głosowane? Wydaje mi się, że ludzie używają wszelkiego rodzaju obejść do rozwiązania tego, i szczerze mówiąc, żaden nie działa lepiej niż po prostu przy użyciu modułu "unicodecsv". –

0

znalazłem najprostszy opcji oprócz doskonałych sugestii Alastair, do używania python3 zamiast python 2. wszystko to było wymagane w moim scr ipt miał zmienić wb w oświadczeniu open po prostu w w accordance with Python3's syntax.

Powiązane problemy