[pyar] otra vez UNICODE...?
Alan Jonatan Romero
eldoblecero en gmail.com
Mar Abr 26 10:26:41 ART 2011
Hola chic en s. Como estan? Les tengo que confesar una barbaridad... llevo un
par de años programando en Python pero... nunca pude comprender del todo el
tema del unicode, por no decir que no lo "comprendi del nada"
directamente... Ya me sé la historia, los encodings que existen como ANSI,
LATIN1, UTF-8, UTF-16, se que el tema está RECONTRA tratado... He leído el
tema muchísimas veces googleando, buscando por todos lados (incluso en las
docs de python) y no hay caso con que pueda entender cuándo usar un
"unicode(cadena, 'utf-8')",
un
"cadena.encode(utf-8)"
o un
"cadena.decode('utf-8)"
Repito, llevo años tratando de entender el tema y hasta ahora no tuve más
remedio que esquivar el unicode y no poner acentos o ñ's, sólo usaba el
u'ñoquis' porque sé que funciona, pero en este momento tengo este programa
en el que necesito estar preparado para cualquier caracter que venga, en
cualquier máquina y cualquier carpeta/directorio, a prueba de giles y toda
la cosa, porque estoy trabajando y trato de mostrar a los visualeros de mis
compañeros que python tiene los pantalones bien puestos y que se pueden
hacer cosas bien chetas... :P
Asi que bueno, aqui está el código, y se los adjunto. Les comento que uso
Geany, Python 2.7, modulos: xlrd, xlwt (que no se ven en este código),
wxPython... y desgraciadamente estoy programando en windows xp... Pero
bueno, hay que hacerlo. Lo que pido es que me "dejen andando" este script y
me expliquen que corno fue lo que no entendí del uso de unicode...
CODIGO:
unicode.py
----------------
#!/usr/bin/env python
# -*- coding: utf-8 -*-
### CLASES ###
class Valores_Prog(): # Me gusta usar clases como si fueran
variables globales... Será pecado?
def __init__(self):
self.nombre_archivo = '' # Se extrae de ruta_cruda con un for que
recorre de "-0" hasta la primer \ (SIN LA EXTENSION)
self.ruta_cruda = '' # Es el valor pelado (sin tratamiento) de
text_ctrl_1
self.ruta_archivo = '' # Se extrae de self.ruta_cruda con un for
invertido que toma los caracteres desde la primer \
self.ruta_destino = '' # self.ruta_archivo + self.nombre_archivo +
'x_autogen.xls' donde x es una letra que depende de cierta variable
class Text_Ctrl(): # Simulo un text control de wxWidgets aunque un tanto...
pobre
def __init__(self):
self.value = ''
def GetValue(self): # Devuelve el valor del "Text_Ctrl"
return self.value
def SetValue(self, valor): # Establece el valor de "Text_Ctrl"
self.value = valor
### METODOS Y FUNCIONES ###
def botonFiltrar(self, evt): # Esto se ejecuta al presionar un boton. Dicho
boton esta 'bindeado' a este metodo
# Obtenemos el valor del campo de texto text_ctrl_1
valores_prog.ruta_cruda = text_ctrl_1.GetValue()
# Tomamos la ultima parte de la cadena valores_prog.ruta_cruda, que es
el nombre de archivo
valores_prog.nombre_archivo =
obtener_nombre_archivo(valores_prog.ruta_cruda)
# Esto es para chequear algunos nombres en la ruta del archivo
valores_prog.ruta_archivo = separar_string(valores_prog.ruta_cruda,'no
filtrar')# Ruta del archivo importado
# La ruta con el nombre con que se guardara el archivo
valores_prog.ruta_destino = u'%s%s_autogen.xls' %
(separar_string(valores_prog.ruta_cruda,'no filtrar','minuscula'),
obtener_nombre_archivo(valores_prog.ruta_cruda)) # Ruta del archivo a
exportar
# Con esto busco dentro del archivo los contenidos de los campos para
deducir que accion realizar
#~ chequear_modo_operacion()
def obtener_nombre_archivo(ruta): # Supongo que el nombre es lo
suficientemente descriptivo
nombre = '' # Aqui se guarda el nombre para ser
devuelto
caracteres = '' # Guardará cada caracter antes de volcarse
a nombre
copiar_caracter = False # Indica si se copian o no los caracteres
for letra in reversed(ruta): # Es mas fácil tomar los caracteres desde
el ultimo hasta que aparezca una '\'
#~ print letra,
if letra != '\\' and copiar_caracter == True:
caracteres += letra
if letra == '.': # Estoy considerando que el archivo tenga
extension, sin embargo no me convence eso...
#~ print 'Comienzo a copiar'
copiar_caracter = True
if letra == '\\':
break
nombre = str(caracteres)[::-1]# Como los caracteres se copiaron al
revés, copiamos a caracteres desde el fin al principio
#~ print '\nEl nombre del archivo: ',nombre
return nombre
def
separar_string(ruta,filtrar='filtrar',letra_case='mayuscula',nombre_archivo=False):
### Metodo para separar en palabras la ruta o cadena dada ###
# El argumento filtrar indica si se quitaran los caracteres separadores
o se dejaran
# para utilizar el resultado como ruta y no solo como palabras
palabra = '' # Contendra las palabras que luego se
guardaran en lista_palabras_temp
nombre = '' # Contendra los caracteres que se ubicaran
en lista_palabras_temp
copiar_caracter = False # Indica si se guarda el caracter que se
esta consultando
lista_palabras = [] # La lista final que contendra las palabras
de la ruta o la ruta misma del archivo
lista_palabras_temp = [] # Lista que contiene las palabras antes de
ser pasadas a lista_palabras
lista_no_filtrar = [] # Lista que contendra las palabras antes de
ser convertidas a string y pasadas a lista_palabras_temp
### nombre_archivo == True ### (Se incluye el nombre de archivo en el
resultado)
if nombre_archivo == True:
for letra in reversed(valores_prog.ruta_cruda):
if letra_case == 'mayuscula': # si deseo buscar palabras en la
ruta, es mas facil ...
nombre += letra.upper() # ...convertir todo a mayusculas
para que no joda el case sensitive
elif letra_case == 'minuscula':
nombre += letra
if letra == '\\':
break
### FILTRAR ### (Se filtra la ruta quitando espacios y \, porque
necesito buscar ciertas palabras)
if filtrar == 'filtrar':
if letra_case == 'mayuscula':
lista_palabras.append(nombre[::-1].upper) # Metemos el nombre
para que sea el primer objeto de la lista
elif letra_case == 'minuscula':
lista_palabras.append(nombre[::-1]) # Metemos el nombre para que
sea el primer objeto de la lista
for letra in reversed(valores_prog.ruta_cruda):
if copiar_caracter == True:
if letra not in ('\\',' '):
palabra += letra
else:
if letra_case == 'mayuscula':
lista_palabras_temp.append(palabra[::-1].upper())
elif letra_case == 'minuscula':
lista_palabras_temp.append(palabra[::-1])
palabra = ''
if letra == '\\' and copiar_caracter == False:
#~ print 'Comienzo a copiar'
copiar_caracter = True
if letra_case == 'mayuscula':
lista_palabras_temp.append(palabra[::-1].upper()) # Esto copia
la letra de unidad que al no comenzar con \ queda excluida...
if letra_case == 'minuscula':
lista_palabras_temp.append(palabra[::-1]) # Esto copia la letra
de unidad que al no comenzar con \ queda excluida...
### NO FILTRAR ### (Se incluyen espacios y barras,)
elif filtrar == 'no filtrar':
for letra in reversed(valores_prog.ruta_cruda):
if copiar_caracter == True:
if letra not in ('\\',' '):
palabra += letra
else:
palabra += letra
if letra_case == 'mayuscula':
lista_no_filtrar.append(palabra.upper())
elif letra_case == 'minuscula':
lista_no_filtrar.append(palabra)
palabra = ''
if letra == '\\' and copiar_caracter == False:
#~ print 'Comienzo a copiar'
palabra += letra
copiar_caracter = True
# Ahora convertimos todas las palabras a string (no recuerdo para
que, luego lo averiguo)
lista_palabras_temp = ''
lista_palabras_temp = nombre
lista_palabras_temp
for palabras in lista_no_filtrar:
lista_palabras_temp += palabras
if letra_case == 'mayuscula':
lista_palabras_temp +=(palabra.upper()) # Esto copia la letra de
unidad que al no comenzar con \ queda excluida...
elif letra_case == 'minuscula':
lista_palabras_temp +=(palabra) # Esto copia la letra de
unidad que al no comenzar con \ queda excluida...
lista_palabras = lista_palabras_temp[::-1]
print 'Argumentos: FILTRAR=%s LETRA_CASE=%s NOMBRE_ARCHIVO=%s' %
(filtrar, letra_case, nombre_archivo)
#~ print 'Palabras obtenidas:\n',lista_palabras
return lista_palabras
#######################################################################
### INSTANCIAS DE CLASES ###
valores_prog = Valores_Prog()
text_ctrl_1 = Text_Ctrl()
### CUERPO DEL PROGRAMA ###
valor = 'C:\\ruta\\del\\archivo\\con caracteres\\raros como ñ o\\a.piripipi'
# pongan lo que quieran aqui
text_ctrl_1.SetValue(valor) # Ingresamos el valor a text_ctrl_1
evt = 'Este sería el evento que emite el boton al ser pulsado'
botonFiltrar('self?',evt) # Hacemos click imaginario al boton
# Deberia poder como minimo imprimir los valores
print '\nnombre_archivo: ', valores_prog.nombre_archivo
print 'ruta_cruda: ' , valores_prog.ruta_cruda
print 'ruta_archivo: ' , valores_prog.ruta_archivo
print 'ruta_destino: ' , valores_prog.ruta_destino
GRACIAS por su invaluable ayuda! Nos estamos viendo en algun momento
--
>> ========================= > El Alan
_____________
_ | |
_ | :{i i}: _|
_ | |||| |
_ | _.|||| _ _|
_ | ( ||||U ) |
_ | ) |||| ( |
_ | ( [:::] ) |
_ | `·-.....-·´ |
_ |_____________|
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20110426/b850ce19/attachment.html>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: unicode.py
Type: application/octet-stream
Size: 8376 bytes
Desc: no disponible
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20110426/b850ce19/attachment.obj>
More information about the pyar
mailing list