2013-03-12 12 views
10

Ci sono alcuni thread su stackoverflow, ma non sono riuscito a trovare una soluzione valida al problema nel suo complesso.Il codec 'ascii' non può codificare il carattere in posizione * ord non compreso nell'intervallo (128)

Ho raccolto enormi somme di dati testuali dalla funzione di lettura urllib e memorizzato nello stesso file di pickle.

Ora voglio scrivere questi dati in un file. errori durante la scrittura mi sto simili a -

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

e un sacco di dati si sta perdendo.

Suppongo che i dati dal urllib lettura è byte di dati

Ho provato

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') 

ma ancora im finendo con errori simili. Qualcuno può indicare una soluzione adeguata. E anche i codec dovrebbero funzionare. Non ho problemi se i byte di conflitto non vengono scritti nel file come stringa, quindi la perdita viene accettata.

+1

Potete mostrare che cosa è in 'Text'? –

risposta

11

Y Puoi farlo tramite il modulo smart_str del modulo Django. Basta provare questo:

from django.utils.encoding import smart_str, smart_unicode 

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

È possibile installare Django avviando una shell dei comandi con privilegi di amministratore ed eseguire questo comando:

pip install Django 
+0

I risultati sono sorprendentemente simili alla codifica ('ascii', 'ignore') – minocha

+1

Due anni dopo la linea, posso dire quanto sia importante questa risposta per python2.7, mi dispiace per l'osservazione sconsiderata sopra ^ – minocha

9

I dati sono unicode dati. Per scrivere che in un file, utilizzare .encode():

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

ma che sarebbe rimuovere tutto ciò che non è ASCII. Forse hai voluto codificare su una codifica più adatta, come UTF-8, invece?

Si consiglia di leggere su Python e Unicode:

+2

E forse anche [Say Hello to Unicode] (http://kos.gd/2013/02/say-hello-to-unicode/) (plug spudorato :-)) – Kos

+0

Questo funziona per la maggior parte della misura .. – minocha

+0

@ martijn-pieters Ho notato che mentre scrivevo sul db ho usato la funzione di codifica. e stavo inutilmente facendo la decodifica della codifica mentre scaricavo nuovamente il contenuto in un file di testo. Ci sono tuttavia alcuni errori, forse a causa di utf 8 e utf 16 conflitti. qual è la risoluzione che potresti suggerire? – minocha

Problemi correlati