2011-12-19 11 views
7

Ok, ho letto molte domande simili e credo di seguire correttamente il consiglio, ma in qualche modo il mio codice non funziona ancora.UnicodeEncodeError: il codec 'ascii' non può codificare il carattere u ' u2019' nella posizione 126: ordinale non compreso nell'intervallo (128)

Ho analizzato un file xml. Ho letto qui che l'output è ora unicode. Sto usando il csv writer per scrivere l'output in un file.

Quindi, nel mio codice ho provato a codificare in utf-8 prima di usare authorow. Perché ottengo ancora l'errore su authorow? Il mio avvertimento, "unicode !!!" non viene lanciato fino a quando non si verifica questo errore (lo sto eseguendo su più file e funziona per la maggior parte). In realtà, però, non capisco perché la scrittrice stia cercando di usare ascii, non dovrebbe aspettarsi utf-8? Ho sostituito utf-8 con ascii nella funzione di codifica solo per i calci. Stessi risultati Per favore aiuto!!!

 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

"Ho analizzato un file xml. Ho letto qui che l'output è ora unicode." Mostra come analizzi l'XML. –

risposta

9

Quando si chiama mystring.encode(..., non sta cambiando la stringa sul posto; restituisce una nuova stringa.

+0

Come si chiama la nuova stringa? – user1106322

+0

Oh snap, mystring2 = mystring.encode (...) quindi aggiungi mystring2 funziona! Grazie! – user1106322

+0

Non si chiama nulla; è un valore di ritorno. Il motivo è che (a) le stringhe (sia Unicode sia le stringhe di byte) sono immutabili; (b) anche se non lo fossero, sono due tipi diversi, quindi una stringa Unicode non può semplicemente trasformarsi in una stringa di byte codificata. –

Problemi correlati