[Python-es] Código funciona en Py3 pero no en Py2.6

Chema Cortes pych3m4 en gmail.com
Mie Ago 25 09:34:27 CEST 2010


El 24 de agosto de 2010 19:05, Mauricio Baeza
<mauricio en correolibre.net> escribió:
> Estoy haciendo mis primeros programas en Python y tengo la siguiente duda. Si hago:
>
> $ python3 actualizarxml.py
>
> El archivo se actualiza bien. Pero si hago:
>
> $ python actualizarxml.py
>
> Me muestra el siguiente mensaje de error y el archivo XML lo deja trunco.
>
> Traceback (most recent call last):
>   File "actualizarxml.py", line 13, in <module>
>     domDoc.writexml(xml_file)
>   File "/usr/lib/python2.6/site-packages/_xmlplus/dom/minidom.py", line 1746, in writexml
>     node.writexml(writer, indent, addindent, newl)
>   File "/usr/lib/python2.6/site-packages/_xmlplus/dom/minidom.py", line 816, in writexml
>     _write_data(writer, attrs[a_name].value)
>   File "/usr/lib/python2.6/site-packages/_xmlplus/dom/minidom.py", line 306, in _write_data
>     writer.write(data)
> UnicodeEncodeError: 'ascii' codec can't encode character u'\xf3' in position 41: ordinal not in range(128)

Aquí te dice que estás intentando escribir caracteres unicode en un
fichero ascii.

> La ultima línea me hizo pensar en algún caracter extraño pero el archivo es generado correctamente por la misma librería y donde se corta el XML son caracteres válidos, aquí el código que estoy usando:
>
> # This Python file uses the following encoding: utf-8
> from xml.dom import minidom
>
> archivo = open('sellob64.txt', 'r')
> sello = archivo.read()
> archivo.close()
>
> domDoc = minidom.parse('Factura.xml')
> nodo = domDoc.getElementsByTagName('Comprobante')
> nodo[0].setAttribute('sello',sello)
>
> archivo = open('Factura.xml', 'w')
> domDoc.writexml(archivo)
> archivo.close()

En python3 todo texto es unicode y los ficheros de texto usan la
codificación por defecto del sistema (utf8) si no especificas otra
cosa. Para abrir ficheros utf8 en python 2.x se tiene que usar el
módulo codecs.

archivo=codecs.open("Factura.xml","w",encoding="utf8")


Más información sobre la lista de distribución Python-es