[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('&', '&')
> n = n.replace('<','<')
> n = n.replace('>','>')
> 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