[Programación]dudita python

Fabian Ezequiel Gallina galli.87 en gmail.com
Vie Mar 5 21:50:21 ART 2010


El día 5 de marzo de 2010 21:07, Emiliano Nuñez
<nunez.emiliano en gmail.com> escribió:
>> El día 5 de marzo de 2010 20:21, Emiliano Nuñez
>> <nunez.emiliano en gmail.com> escribió:
>>> Alguien me explica por qué imprime diferente lo siguiente?:
>>>
>>> 1 - >>> print urllib.unquote("file://NI%C3%91A PASTORI")
>>> file://NIÑA PASTORI
>>>
>>>
>>> 2- >>> urllib.unquote("file://NI%C3%91A PASTORI")
>>> 'file://NI\xc3\x91A PASTORI'
>>
>> En el primer caso, lo que te aparece en pantalla es la salida de la
>> función print, que sabe como representar en pantalla (de acuerdo al
>> encoding de tu terminal. ) los caracteres no ascii (ord > 127) que
>> estén embebidos en tu objeto, que en este caso es un string.
>> Hint: probá a cambiar el encoding de tu terminal y fijate que
>> probablemente lo que te aparezca en pantalla sea distinto
>>
>> En el segundo caso, estás viendo la representación "cruda" del objeto,
>> podríamos decir lo que en realidad "es", los bytes que lo componen..
>>
>>
>>>
>>> Lo que necesito y guardar en una variable la salida del caso 1.
>>>
>> Lo que guardás/serializás es el string en sí mismo, no "cómo luce".
>> Cómo lo muestres cuando después lo vuelvas a usar, vuelve a ser una
>> cuestión de representación.
>>
>> Sugerencia: pegale una miradita en la doc de python al manejo de
>> unicode. (O a unicode en general, independientemente de Python)
>>
>> Saludos.
>
> Hola Ernesto, gracias por responder, clarisimo.
>
> El tema viene por lo siguiente, quiero abrir el siguiente fichero:
>
>>>> a=file(u'/home/emiliano/music/NI\xc3\x91A PASTORI/Joyas Prestadas/02 - Vivir Sin Aire.ogg',"rb");
> Traceback (most recent call last):
>  File "<stdin>", line 1, in <module>
> IOError: [Errno 2] No such file or directory:
> u'/home/emiliano/music/NI\xc3\x91A PASTORI/Joyas Prestadas/02 - Vivir
> Sin Aire.ogg'
>>>>
>
> como puedes ver le indico que es unicode antes de comenzar la cadena.
>
> sin ambargo:
>
>>>> a=file(u'/home/emiliano/music/NIÑA PASTORI/Joyas Prestadas/02 - Vivir Sin Aire.ogg',"rb");
>>>>
>
> lo abre correctamente.
>

Buenas Emi!

Así que la andás pythoneando? :D

Al ponerle la u a un string no lo estas convirtiendo a unicode sino
que lo estás marcando como tal, para convertirlo corréctamente tenés
que usar los métodos encode y decode de str.

La solución es decodear el string al tipo de encoding que usas en tu
sistema de archivos. Sería algo así:

In [1]: import os, sys

In [2]: pastori = [x for x in os.listdir('.') if "pastori" in x.lower()][0]

In [3]: pastori
Out[3]: 'NI\xc3\x91A PASTORI'

In [4]: upastori = pastori.decode(sys.getfilesystemencoding())

In [5]: upastori
Out[5]: u'NI\xd1A PASTORI'

In [6]: file = open(upastori + "/archivo.txt")

In [7]: file
Out[7]: <open file u'NI\xd1A PASTORI/archivo.txt', mode 'r' at 0x206e828>


El directorio se llamaba...

drwxr-xr-x  2 fgallina users     4096 mar  5 21:18 NIÑA PASTORI/


Si, ya se lo que estás pensando, el tema de los encodings es un
garrón. Y sí, lo es.

Afortunadamente python 3 usa unicode por default, cuando se adopte un
poco más va a ser una magia.



Bonus: Cuando quieras abrir un archivo tipo utf-8 y escribir unicode
en él te conviene usar codecs.

import codecs
codecs.open('archivounicode.txt', encoding='utf-8', mode='w')



Saludos,
-- 
Fabián E. Gallina
http://www.from-the-cloud.com


Más información sobre la lista de distribución Programacion