[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