2012-01-30 14 views
9

Cuando ejecuto os.walk(), obtengo mis resultados en orden alfanumérico; comenzando desde 0, terminando en z. ¿Es posible revertir esto?os.walk() al revés?

Así que si tengo 3 directorios; apple/, bananas/, pears/, quisiera pears/, bananas/ y apples/ devuelto.

Obviamente, podría almacenar todos los directorios como una lista y luego .reverse(), pero eso llevará mucho tiempo.

+2

¿por qué necesita hacer esto? –

+0

porque estoy trabajando en un gran conjunto de directorios que están en orden numérico y quiero ver primero los números más altos. – jdborg

Respuesta

15

En primer lugar, os.walk() no especifica el orden en que se devuelven los directorios, por lo tanto, si yo fuera usted, no confiaría en el orden alfabético.

Dicho esto, se puede elegir el orden en que los subdirectorios están atravesados ​​por dejar topdown conjunto a su valor por defecto (True), y luego la clasificación dirs en el lugar:

import os 
top='/home/aix' 
for root, dirs, files in os.walk(top, topdown=True): 
    print root 
    dirs.sort(reverse=True) 

Eso va a hacer os.walk() atraviesa los subdirectorios en orden lexicográfico inverso de sus nombres.

El documentation explica cómo funciona esto:

Cuando topdown es True, la persona que llama puede modificar la lista dirnames en el lugar (tal vez usando del o cesión rebanada), y walk() sólo se Recursividad en los subdirectorios cuyos los nombres permanecen en dirnames; esto se puede utilizar para podar la búsqueda, imponer un orden específico de visita, o incluso para informar walk() sobre los directorios que la persona que llama crea o cambia el nombre antes de reanudar walk() nuevamente.

+0

Gracias. Lea los documentos de antemano, pero no se dio cuenta de que eso significaba que podía reordenar sobre la marcha. – jdborg

1

No se puede invertir un generador de ninguna manera genérica. La única solución es lanzarlo a una secuencia y que iterar sobre la secuencia en orden inverso. Los términos posteriores de un generador no necesariamente se conocerán hasta que se hayan calculado los anteriores.

La siguiente solución usa invertido. El rendimiento debería estar bien si la estructura del directorio no es profunda.

import os 

directory = '/your/dir/' 
for root, dirs, files in reversed(list(os.walk(directory))): 
    print root, dirs, files 
1

Es necesario comprender que en realidad se puede modificar el dirs utilizado por os.walk. (al menos a menos que configure topdown=False explícitamente).

En particular, puede, por ejemplo, eliminar directorios o recurrir a la lista.

import os 
for root, dirs, files in os.walk(startdir): 
    dirs.sort(reverse=True) 
    # Also remove dirs you do not need! 

En realidad debería hacer el truco sin un costo adicional significativo.

Cuestiones relacionadas