[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