[Python-es] problema con las tildes

Luis Miguel Morillas morillas en gmail.com
Dom Abr 4 23:38:50 CEST 2010


El día 4 de abril de 2010 10:26, monoBOT <monobot.soft en gmail.com> escribió:
> la línea 83 está en la función de grabado:
>     def grabar(self, event):
>         dialogo=wx.MessageDialog(None, '¿Desea Grabar y Salir?', 'Atención',
> wx.YES_NO|wx.ICON_QUESTION|wx.STAY_ON_TOP)
>         respuesta=dialogo.ShowModal()
>         if (respuesta ==wx.ID_YES):
>             print 'obteniendo valores...'
>             nombres_attr = ['numerocolegiado','nombre', 'primerapellido',
> 'segundoapellido', 'dni', 'direccion', 'codigopostal', 'poblacion', 'email',
> 'telefono1', 'telefono2']
>             datos_entrados = [self.ventana.entranumcol,
> self.ventana.entranombre, self.ventana.entraapellido1,
> self.ventana.entraapellido2, self.ventana.entradni, self.ventana.entradirec,
> self.ventana.entrapost, self.ventana.entrapobl, self.ventana.entraemail,
> self.ventana.entratf1, self.ventana.entratf2]
>             print 'guardando...'
>             for m in range(len(datos_entrados)):
>                 cambia_attrib(arbol='usuario', dato=nombres_attr[m],
> nuevovalor=reg_xml(datos_entrados[m].GetValue()))
>             nom_empr = ['nombreempresa', 'cifempresa',
> 'direccionempresa','codigopostalempresa', 'telefonoempresa']
>             dat_empr = [self.ventana.entranombreempresa,
> self.ventana.entracifempresa, self.ventana.entradireccionempresa,
> self.ventana.entracodigopostalempresa, self.ventana.entratelefonoempresa]
>             for m in range(len(nom_empr)):
>                 cambia_attrib(arbol='datosempresa', dato=nom_empr[m],
> nuevovalor=reg_xml(dat_empr[m].GetValue()))
>             cambia_attrib('usuario', 'colegio',
> reg_xml(self.ventana.entracolegio.GetStringSelection()))
>             cambia_attrib('usuario', 'provincia',
> reg_xml(self.ventana.entraprov.GetStringSelection()))
>             guarda_datos(datogral)
>             print 'guardado'
>             self.Destroy()
>         else:
>             print 'Cancelado'
>             dialogo.Destroy()
> la función de grabado lo que hace es llamar a unas
> variables self.ventana.entranombreempresa     todas ellas se montan de esta
> forma:
> self.ventana.entranombre = wx.TextCtrl(self.ventana, -1, nombre_en_fichero)
> y el valor por defecto de cada una proviene del fichero xml también:
> nombre_en_fichero = xml_none(busqueda_xml ('usuario', 'nombre'))
> así que lo que hago es:
> lee xml ---> muestra en pantalla el dato guardado ---> el usuario cambia los
> datos ---> grabo los datos.
> las funciones de lectura y guardado de xml son:
> def busqueda_xml (arbol, dato):
>     valor =
> arbol_gral.getElementsByTagName(arbol)[0].getElementsByTagName(dato)[0].childNodes[0].nodeValue
>     return valor
> def guarda_datos(archivo):
>     fichero = open(os.path.realpath(archivo), "w")
>     arbol_gral.writexml(fichero, encoding='iso-8859-1')
>     fichero.close()
>     return True

El error lo genera writexml en esta función. Yo no utilizo minidom,
pero supongo que esto te funcionará:

import codecs # esto ponlo al principio del fichero

def guarda_datos(archivo):
      fichero = codecs.open(os.path.realpath(archivo),  "w", 'iso-8859-1')
      arbol_gral.writexml(fichero, encoding='iso-8859-1')
      fichero.close()
      return True

Si quieres utilizar tu código en un sistema en producción, habría que
revisar algunas cosas. Yo te recomiendo utilizar otros módulos en
lugar de minidom. Echa un vistazo a Amara
(http://wiki.xml3k.org/Amara2), te permite manejar xml como si fueran
objetos python.

--lm

> la funcion xml_none lo que hace es cambiar una entrada igual a cero por un
> campo limpio
> def xml_none(m):
>     if m =='0':
>         n = ''
>         return n
>     return m
> la función contraria la pongo al grabar y lo que hace es convertir un campo
> vacío en un 0, y también los caracteres prohibidos por xml por sus sutitutos
> ... así evito el error al grabar.
>
> def reg_xml(m):
>     if m == '':
>         n = '0'
>         return n
>     n = m.replace('&', '&amp')
>     n = n.replace('<','&lt')
>     n = n.replace('>','&gt')
>     return n
>
> --
> monobotblog.alvarezalonso.es
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>



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