2011-07-12 7 views
15

Me gustaría saber si es posible forzar que os.walk en python3 visite los directorios en orden alfabético. Por ejemplo, aquí es un directorio y un código que le guiará a este directorio:¿Puedo forzar que os.walk de python3 visite los directorios en orden alfabético? ¿cómo?

ryan:~/bktest$ ls -1 sample 
CD01 
CD02 
CD03 
CD04 
CD05 

-------- 

def main_work_subdirs(gl): 
    for root, dirs, files in os.walk(gl['pwd']): 
     if root == gl['pwd']: 
      for d2i in dirs: 
       print(d2i) 

Cuando el código Python golpea el directorio anterior, aquí está la salida:

ryan:~/bktest$ ~/test.py sample 
CD03 
CD01 
CD05 
CD02 
CD04 

me gustaría forzar a pie para visitar estos directorios en orden alfabético, 01, 02 ... 05. En el python3 doc for os.walk, que dice:

Cuando arriba hacia abajo es cierto que la persona que llama puede modificar la lista dirnames en el lugar (tal vez usando del o cesión rebanada), y caminar() sólo Recurse en los subdirectorios cuyos los nombres permanecen en dirnames; esto se puede utiliza para podar la búsqueda, imponer un orden específico de visitar

¿Eso significa que puedo imponer un orden alfabético en visitar os.walk? ¿Si es así, cómo?

Respuesta

26

Sí. Clasificas los directorios en el bucle.

def main_work_subdirs(gl): 
    for root, dirs, files in os.walk(gl['pwd']): 
     dirs.sort() 
     if root == gl['pwd']: 
      for d2i in dirs: 
       print(d2i) 
+0

entonces, eso es bastante asombroso. Pensé que lo único que podrías hacer con los generadores fue iterar sobre ellos. –

+0

@ryan_m: Ese * es * todo lo que puede hacer. Pero dado que el siguiente paso en la iteración no se genera hasta que haya terminado con el primero, permite trucos como este. :-) –

+0

buen truco! :-) ~ –

0

Sé que esto ya ha sido contestada pero quería añadir un pequeño detalle y la adición de más de una sola línea de código en los comentarios es poco firme.

Además de querer ordenar los directorios, también quería los archivos ordenados para que mi iteración a través de "gl" fuera consistente y predecible. Para hacer esto, se requirió una clasificación más:

for root, dirs, files in os.walk(gl): 
    dirs.sort() 
    for filename in sorted(files): 
    print(os.path.join(root, filename)) 
Cuestiones relacionadas