Foros del Web » Programando para Internet » Python »

Caracteres especiales en python

Estas en el tema de Caracteres especiales en python en el foro de Python en Foros del Web. Tengo problemas para manipular cadenas con caracteres especiales como ñ y ´ . Esto me habia pasado con anterioridad pero los había omitido al encontrar ...
  #1 (permalink)  
Antiguo 24/10/2011, 21:43
Avatar de wilmermorel  
Fecha de Ingreso: agosto-2011
Ubicación: Santo Domingo
Mensajes: 30
Antigüedad: 12 años, 8 meses
Puntos: 2
Pregunta Caracteres especiales en python

Tengo problemas para manipular cadenas con caracteres especiales como ñ y ´. Esto me habia pasado con anterioridad pero los había omitido al encontrar otras soluciones. Estoy escribiendo una opción gráfica en wxPython para el comando shred en Linux, que permite borrar archivos con un alto nivel de seguridad. Pero al manejar la ruta en cadena que contenga caracteres especiales como la carpeta Música: /home/usuario/Música/archivo.txt, me da la excepción UnicodeEncodeError

El código es algo parecido a este:

Código Python:
Ver original
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import os
  5. import wx
  6.  
  7. def main():
  8.     dlg = wx.FileDialog(None)
  9.     a = dlg.ShowModal()
  10.     if a == wx.ID_OK:
  11.         ruta = dlg.GetPath()
  12.         confirmar = raw_input("Procede a eliminar el archvivo "+ruta+"\nDesea eliminarlo? s/n ")
  13.         if confirmar.lower() == "s":
  14.             os.system("shred -u -v "+ruta)
  15.             print("Archivo eliminado")
  16.         else:
  17.             print("Operación cancelada")
  18.  
  19. if __name__ == "__main__":
  20.     app = wx.PySimpleApp(0)
  21.     wx.InitAllImageHandlers()
  22.     while True:
  23.         main()

Última edición por razpeitia; 24/10/2011 a las 21:49
  #2 (permalink)  
Antiguo 24/10/2011, 21:55
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Caracteres especiales en python

Lo que pasa es que tienes que convertir la ruta a unicode.

Código Python:
Ver original
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import os
  4. import wx
  5.  
  6. def main():
  7.     dlg = wx.FileDialog(None)
  8.     a = dlg.ShowModal()
  9.     if a == wx.ID_OK:
  10.         ruta = dlg.GetPath()
  11.         try:
  12.             ruta = unicode(ruta, "utf-8")
  13.         except UnicodeDecodeError:
  14.             pass
  15.         confirmar = raw_input("Procede a eliminar el archvivo "+ruta+"\nDesea eliminarlo? s/n ")
  16.         if confirmar.lower() == "s":
  17.             os.system("shred -u -v "+ruta)
  18.             print("Archivo eliminado")
  19.         else:
  20.             print("Operación cancelada")
  21.  
  22. if __name__ == "__main__":
  23.     app = wx.PySimpleApp(0)
  24.     wx.InitAllImageHandlers()
  25.     while True:
  26.         main()
  #3 (permalink)  
Antiguo 24/10/2011, 22:12
Avatar de wilmermorel  
Fecha de Ingreso: agosto-2011
Ubicación: Santo Domingo
Mensajes: 30
Antigüedad: 12 años, 8 meses
Puntos: 2
Respuesta: Caracteres especiales en python

He probado el código pero me da un TypeError precisamente en unicode(ruta, "utf-8"), informandome que "decoding Unicode is not supported". De verdad que no entiendo bien el proceso, pero creo que esa linea está codificando la ruta a utf-8, no seria que la decodificara?... No se bien sobre este asunto. Eso de las codificaciones de caracteres me vuelve loco, deberían estandarizar todo ese repertorio de problema algún día.
  #4 (permalink)  
Antiguo 24/10/2011, 22:48
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Caracteres especiales en python

Eso pasa por que ruta ya es unicode, supongo que el linux dlg.GetPath() regresa una cadena unicode, pero en windows no.

Ahora después de buscar un poco me doy cuenta que os.system no acepta cadenas unicode.

Quedando algo mas o menos así
Código Python:
Ver original
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import os
  4. import wx
  5.  
  6. def main():
  7.     dlg = wx.FileDialog(None)
  8.     a = dlg.ShowModal()
  9.     if a == wx.ID_OK:
  10.         ruta = dlg.GetPath()
  11.         if not isinstance(ruta, unicode):
  12.             try:
  13.                 ruta = unicode(ruta, "utf-8")
  14.             except UnicodeDecodeError:
  15.                 pass
  16.         ruta = ruta.encode("utf-8")
  17.         confirmar = raw_input("Procede a eliminar el archvivo "+ruta+"\nDesea eliminarlo? s/n ")
  18.         if confirmar.lower() == "s":
  19.             os.system("shred -u -v "+ruta)
  20.             print("Archivo eliminado")
  21.         else:
  22.             print("Operación cancelada")
  23.  
  24. if __name__ == "__main__":
  25.     app = wx.PySimpleApp(0)
  26.     wx.InitAllImageHandlers()
  27.     while True:
  28.         main()
  #5 (permalink)  
Antiguo 25/10/2011, 09:58
Avatar de wilmermorel  
Fecha de Ingreso: agosto-2011
Ubicación: Santo Domingo
Mensajes: 30
Antigüedad: 12 años, 8 meses
Puntos: 2
Respuesta: Caracteres especiales en python

Perfecto! muchas gracias por tu ayuda. Tengo un modulo para recibir y enviar gmail en proceso y era justamente lo que me faltaba, ya se por donde meterle mano. Gracias!
  #6 (permalink)  
Antiguo 25/10/2011, 11:20
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Caracteres especiales en python

Otra cosa no te recomendaría usar os.system y mucho menos concatenarle el archivo asi nada mas.

Por ejemplo en linux puedo crear un archivo que se llame a; rm -fr / * y eso puede borrar todo tu filesystem.

Te recomiendo usar subprocess.

Etiquetas: ascii, caracteres, codificacion, especiales, shred, utf-8, wxpython
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:05.