Foros del Web » Programando para Internet » Python »

Script renombrado masivo

Estas en el tema de Script renombrado masivo en el foro de Python en Foros del Web. Buenas: Estoy confeccionando un script en Python cuyo objetivo es recorrer el árbol a partir de una ruta concreta y renombrar todos los ficheros y ...
  #1 (permalink)  
Antiguo 09/12/2010, 12:24
 
Fecha de Ingreso: diciembre-2010
Mensajes: 2
Antigüedad: 13 años, 11 meses
Puntos: 0
Script renombrado masivo

Buenas:

Estoy confeccionando un script en Python cuyo objetivo es recorrer el árbol a partir de una ruta concreta y renombrar todos los ficheros y directorios en Mayusculas a minusculas y los espacios que puedan tener los nombres en "_".

El script realiza su cometido correctamente, pero como es lógico si encuentra un directorio que cumple alguno de los requisitos y este es renombrado, pues claro, no puede procesar lo que se encuentra por debajo, y no finaliza el proceso.

Pongamos una estructura como esta:

prueba1
|-- A
| |-- b b
| | |-- JJJ
| | |-- JODER
| | `-- c
| | `-- mierda en bote
| |-- ddd
| | |-- 1
| | |-- 2
| | |-- 3
| | `-- 4
| `-- mier
`-- todo

5 directories, 8 files

En el momento en que renombra el directorio "A" a "a", se detiene la ejecución, al igual que cuando renombra el directorio "b b" a "b_b" pues no procesa los ficheros que cuelgan de el.

Esto provoca que haya que ejecutar el script una o varias veces, dependiendo de los que se encuentre.

¿Sabeis como poder esquivar esto, y que pueda procesar todo de una sola vez, o bien, retomar el proceso de alguna manera?

El script es este:

#!/usr/bin/python

# importamos los modulos...
import os, sys, string, logging, time
#########################
# V A R I A B L E S #
#########################
RUTAG='/home/alberto/prueba1'
LOG=sys.argv[0] + '.log'
DIAHORA = time.strftime("%y%m%d_%H%M",time.localtime())
#########################
# F U N C I O N E S #
#########################
def CHKMAYUS(MAYUS,RUTA):
"""funcion para comprobar si tiene mayusculas y renombrar si fuera
necesario"""
if MAYUS.isupper():
MAYUS2=string.lower(MAYUS)
# renombramos los que esten en mays
MSGMAYUS='renombramos ' + MAYUS + ' a ' + MAYUS2
os.rename(RUTA + '/' + MAYUS, RUTA + '/' + MAYUS2)
print MSGMAYUS
logging.info(MSGMAYUS)

def CHKESPACIO(ESPA,RUTA):
"""funcion para comprobar si tiene espacios y cambiarlos por '_'"""
if ESPA.count(' '):
ESPA2=ESPA.replace(' ','_')
# renombramos los espacios por '_'
MSGESPA='renombramos ' + ESPA + ' a ' + ESPA2
os.rename(RUTA + '/' + ESPA, RUTA + '/' + ESPA2)
print MSGESPA
logging.info(MSGESPA)

#########################
# P R I N C I P A L #
#########################
logging.basicConfig(filename=LOG,level=logging.DEB UG)
logging.info(DIAHORA)
logging.info("************************************ ******************************************")
logging.info("* Renombramos directorios/ficheros a minusculas y
cambiando espacios por '_' *")
logging.info("************************************ ******************************************")
try:
for base, dirs, files in os.walk(RUTAG):
print 'Procesando ' + base
# mostramos lista directorios... SI NO ESTA vacia
if dirs:
# repasamos la lista de directorios
for D in dirs:
# chequeamos los que esten en mays
CHKMAYUS(D,base)
# chequeamos que tengan espacios
CHKESPACIO(D,base)
# mostramos lista ficheros... SI NO ESTA vacia
if files:
# repasamos la lista de ficheros
for F in files:
# chequeamos los que esten en mays
CHKMAYUS(F,base)
# chequeamos que tengan espacios
CHKESPACIO(F,base)
finally:
print "Proceso finalizado correctamente"


Gracias, un saludo,
  #2 (permalink)  
Antiguo 09/12/2010, 13:30
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Script renombrado masivo

Cita:
Iniciado por bypper Ver Mensaje
Código:
for base, dirs, files in os.walk(RUTAG):
Solo cámbialo por:
Código:
for base, dirs, files in os.walk(RUTAG, topdown=False):
Y por eso es importante tener coceptos como DFS y BFS.

Por cierto no estaría mal que manejaras las colisiones.

Por ejemplo que pasa si tengo 2 archivos:
aa_1 y AA 1

Y que me dices de añadirle soporte unicode
Que pasa si tengo 2 archivos:
Ñu ñu
  #3 (permalink)  
Antiguo 09/12/2010, 14:23
 
Fecha de Ingreso: diciembre-2010
Mensajes: 2
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Script renombrado masivo

Grandioso razpeitia,

es perfecto,
gracias
  #4 (permalink)  
Antiguo 14/12/2010, 09:44
Avatar de dmassive  
Fecha de Ingreso: febrero-2002
Ubicación: Paraná - Entre Ríos - Argentina
Mensajes: 279
Antigüedad: 22 años, 8 meses
Puntos: 7
Exclamación Respuesta: Script renombrado masivo

Lo que yo hago en estos casos, es no efectuar los cambios "on de fly", es riesgoso, por lo que voy guardando los cambios a efectuar en una lista, de esa manera tengo la enorme ventaja que puedo deshacer los cambios, o ver un log de lo que paso.
__________________
Blümchen... einfach die rave Prinzessin
http://www.dmassive.com.ar/

Etiquetas: masivo, renombrado
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:59.