2013-03-12 28 views
10

Istnieje kilka wątków na stackoverflow, ale nie mogłem znaleźć poprawnego rozwiązania problemu jako całości.Kodek "ascii" nie może kodować znaków na pozycji * ord nie jest w zasięgu (128)

Zebrałem ogromne sumy danych tekstowych z funkcji odczytu urllib i zapisałem to samo w plikach pikli.

Teraz chcę zapisać te dane do pliku. Pisząc Dostaję błędy podobne do -

'ascii' codec can't encode character u'\u2019' in position 16: ordinal not in range(128) 

i dużo danych jest stracone.

Przypuszczam dane off urllib czytać jest bajt danych

Próbowałem

1. text=text.decode('ascii','ignore') 
    2. s=filter(lambda x: x in string.printable, s) 
    3. text=u''+text 
     text=text.decode().encode('utf-8') 

ale wciąż im kończąc podobnych błędów. Czy ktoś może wskazać właściwe rozwiązanie. A także będzie działać stripe kodeków. Nie mam żadnych problemów, jeśli bajty konfliktu nie są zapisywane do pliku jako ciąg znaków, dlatego utrata jest akceptowana.

+1

można pokazać, co jest w 'text'? –

Odpowiedz

11

Y możesz to zrobić poprzez smart_str z modułu Django. Po prostu spróbuj to:

from django.utils.encoding import smart_str, smart_unicode 

text = u'\u2019' 
print smart_str(text) 

Można zainstalować Django uruchamiając powłokę poleceń z uprawnieniami administratora i wykonaj polecenie:

pip install Django 
+0

Wyniki są uderzająco podobne do kodowania ("ascii", "ignoruj"). – minocha

+1

Dwa lata później mogę powiedzieć, jak ważna jest ta odpowiedź dla python2.7, przepraszam za nierozważną uwagę powyżej ^ – minocha

9

Twoje dane to danych Unicode. Napisać, że do pliku, użyj .encode():

text = text.encode('ascii', 'ignore') 

ale byłoby usunąć wszystko, co nie jest ASCII. Być może zamiast tego chciałeś kodować do bardziej odpowiedniego kodowania, na przykład UTF-8?

Możesz przeczytać na Python i Unicode:

+2

A może również [Przywitaj się z Unicode] (http://kos.gd/2013/02/say-hello-to-unicode/) (bezwstydna wtyczka :-)) – Kos

+0

Działa to w większości przypadków .. – minocha

+0

@ martijn-pieters Zauważyłem, że podczas zapisywania do bazy danych użyłem funkcji kodowania. i niepotrzebnie robiłem dekodowanie kodowania podczas ponownego przesyłania zawartości do pliku tekstowego. Istnieje jednak kilka błędów, być może z powodu utf 8 i utf 16 konfliktów. jakiejkolwiek rozdzielczości, którą możesz zasugerować? – minocha