[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