2011-11-30 16 views
6

me gustaría resursively renombrar directorios cambiando el último carácter en minúsculas (si se trata de una carta)Cómo recursiva bucle a través de una estructura de archivos y renombrar directorios en pitón

he hecho esto con la ayuda de mi publicaciones anteriores (perdón por la publicación doble y no reconociendo las respuestas)

Este código funciona para archivos, pero ¿cómo puedo adaptarlo para directorios también?

import fnmatch 
import os 


def listFiles(dir): 
    rootdir = dir 
    for root, subFolders, files in os.walk(rootdir): 
     for file in files: 
      yield os.path.join(root,file) 
    return 


for f in listFiles(r"N:\Sonstiges\geoserver\IM_Topo\GIS\MAPTILEIMAGES_0\tiles_2"): 
    if f[-5].isalpha(): 
     os.rename(f,f[:-5]+f[-5].lower() + ".JPG") 
     print "Renamed " + "---to---" + f[:-5]+f[-5].lower() + ".JPG" 
+0

Por favor, intente evitar añadir comentarios y firmas ajenas a los mensajes. –

+1

Uno de los problemas con los que se puede encontrar es que cambiar el nombre de un directorio mientras camina por el árbol puede hacer que la caminata falle (ya que puede tratar de entrar en un directorio cuyo nombre ha cambiado). Entonces, lo que podría querer hacer es hacer una lista de todos los directorios que necesitan renombrarse, y tener un bucle separado después de la caminata para renombrarlos. – kindall

Respuesta

7

El problema es que el valor por defecto de os.walk es de arriba hacia abajo. Si intenta cambiar el nombre de los directorios al desplazarse hacia arriba, los resultados son impredecibles.

Inténtelo de os.walk ir de abajo hacia arriba:

for root, subFolders, files in os.walk(rootdir,topdown=False): 

Editar

Otro problema que se tiene es listFiles() está regresando, así, no los archivos directorios.

Este (no probado) devuelve sub directorios desde abajo hacia arriba:

def listDirs(dir): 
    for root, subFolders, files in os.walk(dir, topdown=False): 
     for folder in subFolders: 
      yield os.path.join(root,folder) 
    return 
+0

Gracias por el consejo. No sé cómo puedo cambiar el código para renombrar solo los directorios y no los archivos. He sustituido listFiles con listDirs pero eso no funciona. Cheers, Rob –

+0

Usa 'subFolders' en lugar de' files'. 'files' es una lista de los archivos,' subFolders' una lista de los subdirectorios. – Robin

+0

Genial --- gracias por la ayuda. ¡eso funciono! –

Cuestiones relacionadas