[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