2011-12-19 11 views
7

Dobra, przeczytałem wiele podobnych pytań i uważam, że postępuję zgodnie z poradą poprawnie, ale jakoś mój kod nadal nie działa.UnicodeEncodeError: kodek 'ascii' nie może kodować znaków u ' u2019' w pozycji 126: porządek nie jest w zakresie (128)

Przetworzyłem plik xml. Czytałem tutaj, że wyjście jest teraz w Unicode. Używam programu piszącego CSV do zapisywania danych wyjściowych do pliku.

Tak, w moim kodzie próbowałem kodować w utf-8 przed użyciem writerow. Dlaczego wciąż dostaję błąd w pisarzu? Moje ostrzeżenie "unicode !!!" nie zostanie zgłoszony, dopóki ten błąd się nie pojawi (używam tego w wielu plikach i działa to dla większości). Właściwie to nie rozumiem, dlaczego pisarz próbuje używać ascii, czy nie powinien spodziewać się utf-8? Wymieniłem utf-8 na ascii w funkcji kodowania tylko dla kopnięć. Takie same wyniki. Proszę pomóż!!!

 try: 

      mystring=elem.find('./'+r2+'Description').text 


      if isinstance(mystring, unicode): 
       print("unicode!!!") 
       mystring.encode('utf-8','ignore') 
       datalist.append(mystring) 
      else:  
       datalist.append(mystring) 
     except AttributeError: 
      datalist.append('No text') 

     c.writerow(datalist) 
+1

"Przetworzyłem plik xml. Przeczytałem, że dane wyjściowe są teraz w formacie Unicode." Pokaż, jak analizować XML. –

Odpowiedz

9

Po wywołaniu mystring.encode(... nie zmienia ona ciągów w miejscu; zwraca nowy ciąg.

+0

Jak nazywa się nowy ciąg? – user1106322

+0

Och snap, mystring2 = mystring.encode (...) a następnie dodawaj mystring2 działa! Dzięki! – user1106322

+0

To nic nie nazywa; to jest wartość zwracana. Powodem jest to, że (a) łańcuchy znaków (zarówno w standardzie Unicode, jak i bajt) są niezmienne; (b) nawet jeśli nie były, są to dwa różne typy, więc ciąg znaków Unicode nie może po prostu przekształcić się w kodowany ciąg bajtów w miejscu. –

Powiązane problemy