[Python-es] Re: Codificacion y nombres de archivos
Oswaldo Hernández
listas en soft-com.es
Lun Jun 18 20:58:15 CEST 2007
Adjunto va el script como ha quedado. Me ha funcionado correctamente con defaultencoding = UTF-8, no
consigo hacer que funciona bien con 'ascii'.
Si alguien se decide a utilizarlo Ojo, Copia de seguridad ;)
Saludos,
--
*****************************************
Oswaldo Hernández
oswaldo (@) soft-com (.) es
*****************************************
------------ próxima parte ------------
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# Recodificacion de nombres de archivos y directorios
import os
import sys
import locale
ruta = "/home/datos" # ruta inicial
COD_ORIGEN = "cp850" # codificacion actual de los nombres de archivo y directorio
COD_DESTINO = sys.getfilesystemencoding() # codificacion destino (UTF-8)
print "Recodificacion de nombres de archivo y directorio"
print "%s -> %s" % (COD_ORIGEN, COD_DESTINO)
if sys.getdefaultencoding().upper() != "UTF-8":
print "Esta version solo funciona con codificacion UTF-8"
sys.exit(1)
def recodifica(src):
# comprobacion de encoding
# devuelve la cadena recodificada si su codificacion no es COD_DESTINO
# OJO, puede ser no del todo fiable, hacer siempre copia de seguridad antes del proceso
try:
# comprobar si ya esta en la codificacion destino
if src.encode(COD_DESTINO) == src:
return src # OK, misma codificacion
# No hay error pero son distintos ????, intenta recodificar
return src.decode(COD_ORIGEN).encode(COD_DESTINO)
except UnicodeDecodeError:
# recodificar
return src.decode(COD_ORIGEN).encode(COD_DESTINO)
except Exception, e:
# ??? puede que la codificacion de origen no sea correcta ???
print "Error <%s> al intentar recodificar:%s " % (e, src)
raise
print " ---------------- DIRECTORIOS ------------------"
# la iteracion dinamica de walk puede hacer que si modificamos un directorio, no vea los subdirectorios que contiene
# se repite el proceso hasta que se haga todo
while 1:
algohecho = False
for root, dirs, files in os.walk(ruta):
for dir in dirs:
dir_dest = recodifica(dir)
if dir_dest != dir:
origen = os.path.join(root, dir)
destino = os.path.join(root, dir_dest)
print "renombar directorio:\n%s\n-> %s\n" % (origen, destino)
os.rename(origen, destino)
# activar flag
algohecho = True
if not algohecho:
break
print " ----------------- ARCHIVOS --------------------"
for root, dirs, files in os.walk(ruta):
for archivo in files:
f_dest = recodifica(archivo)
if f_dest != archivo:
origen = os.path.join(root, archivo)
destino = os.path.join(root, f_dest)
print "renombrar archivo:\n%s\n-> %s\n" % (origen, destino)
os.rename(origen, destino)
print "Hecho :)"
Más información sobre la lista de distribución Python-es