[Python-es] Re: Codificacion y nombres de archivos
Oswaldo Hernández
listas en soft-com.es
Lun Jun 18 17:27:57 CEST 2007
Gabriel Genellina escribió:
> En Mon, 18 Jun 2007 05:41:48 -0300, Oswaldo Hernández
> <listas en soft-com.es> escribió:
>
>> He realizado una nueva instalacion con debian etch, la codificacion
>> del sistema es:
>> server:/datos# locale
>> LANG=es_ES.UTF-8 [...]
>>
>> Sobre esta instalacion he copiado los datos de otro disco que tenia
>> debian sarge con codificacion ISO8859-15.
>>
>> La copia la he realizado directamente, instalando el disco en el
>> equipo, haciendo un mount de la particion (ext2) y un cp -a.
>
> Y no te dio errores al copiar? El problema con utf-8 es que no cualquier
> secuencia de bytes es válida, y si el original era ISO8859-15, eso
> podria pasar.
No, no me dio ningún problema.
>
>> El problema son los nombres de los archivos, los usuarios de ese
>> servidor guardaban muchos archivos (usando samba) con acentos, eñes,
>> etc. en los nombres de los archivos.
>>
>> print "Codificacion local: %s" % sys.getdefaultencoding()
>
> Esto deberia mostrar ASCII - cualquier otra cosa trae problemas, no es
> el valor por defecto, y tuviste que haberlo modificado a proposito en
> site.py.
Si, lo modifique a utf-8, pensando que el problema podia venir por ahi.
> De cualquier modo, lo que te interesa en realidad no es eso sino
> sys.getfilesystemencoding() que supongo que te da utf-8
Exacto.
>
>> for root, dir, files in os.walk("."):
>
> Creo que te convendria usar walk(u"."):
lo probé, pero me lanza una excepción:
File "renamefiles.py", line 14, in ?
for root, dirs, files in os.walk(root):
File "/usr/lib/python2.4/os.py", line 281, in walk
if isdir(join(top, name)):
File "/usr/lib/python2.4/posixpath.py", line 63, in join
path += b
File "encodings/utf_8.py", line 16, in decode
UnicodeDecodeError: 'utf8' codec can't decode byte 0x82 in position 21: unexpected code byte
>
>> # archivos
>> for f in files:
>> try:
>> fd = f.decode("iso-8859-15")
>> if fd != f:
>> print "renombrar %s -> %s" & (f, fd)
>
> Y aca:
> if isinstance(f, unicode):
> f_utf8 = f.encode("utf-8")
> f_8859 = f.encode("iso-8859-15")
> if f_utf8!=f_8859:
> # renombrar f_8859 a f_utf8
> elif isinstance(f, str):
> # algo que no se pudo convertir a unicode
> # porque dio errores
> # asumimos que es iso-8859-15
> f_utf8 = f.decode("iso-8859-15").encode("utf-8")
> # renombrar f a f_utf8
>
Despues de analizar las nombres de archivo que devuelve walk veo que nos los nombres de archivo no
estaban codificados en ISO8859-1, sino en cp850 ( cosas del samba+windows+la madre que ... !!!)
Analizando el codigo que me propones veo que una vez decodificado vuelves a codificar el resultado
como utf-8:
f.decode("iso-8859-15").encode("utf-8")
Yo solo estaba haciendo el encode, hago la prueba con mi codigo y *funciona* :)
Me queda una duda sobre la iteracion, raw no devuelve listas, sino iteradores, el modificar los
nombres de los archivos y directorios sobre los que se está iterando ¿traerá algun problema?
Gracias por tu ayuda, en cuanto termine el script lo envio a la lista.
--
*****************************************
Oswaldo Hernández
oswaldo (@) soft-com (.) es
*****************************************
Más información sobre la lista de distribución Python-es