2011-12-19 17 views
7

Bien, he leído muchas preguntas similares, y creo que estoy siguiendo el consejo correctamente, pero de alguna manera mi código aún no está funcionando.UnicodeEncodeError: el códec 'ascii' no puede codificar el carácter u ' u2019' en la posición 126: ordinal no en rango (128)

He analizado un archivo xml. He leído aquí que la salida ahora es unicode. Estoy usando el escritor csv para escribir salida en un archivo.

Por lo tanto, en mi código he intentado codificar en utf-8 antes de usar writerow. ¿Por qué todavía obtengo el error en writerow? Mi advertencia, "unicode !!!" no se lanza hasta que ocurre este error (estoy ejecutando esto en varios archivos, y funciona para la mayoría). En realidad, sin embargo, no entiendo por qué el escritor está tratando de usar ascii, ¿no debería esperar utf-8? He reemplazado utf-8 con ascii en la función de codificación solo para patadas. Mismos resultados ¡¡¡Por favor ayuda!!!

 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

"He analizado un archivo xml. He leído que la salida ahora es unicode". Muestre cómo analiza el XML. –

Respuesta

9

Cuando se llama a mystring.encode(..., no está cambiando la cadena en el lugar; devuelve una nueva cadena.

+0

¿Cómo se llama la nueva cadena? – user1106322

+0

Oh snap, mystring2 = mystring.encode (...) luego anexar mystring2 funciona! ¡Gracias! – user1106322

+0

No se llama nada; es un valor de retorno. La razón es que (a) las cadenas (tanto Unicode como byte-strings) son inmutables; (b) incluso si no lo fueran, esos son dos tipos diferentes, por lo que una cadena Unicode no puede simplemente transformarse en una cadena de bytes codificada en su lugar. –

Cuestiones relacionadas