2012-01-30 17 views
9

Po uruchomieniu os.walk() otrzymuję wyniki w porządku alfanumerycznym; począwszy od 0, kończąc na z. Czy można to odwrócić?os.walk() w odwrotnej kolejności?

Więc jeśli mam 3 katalogi; apple/, bananas/, pears/, chciałbym zwrócić pears/, bananas/ i apples/.

Oczywiście mogłem przechowywać wszystkie katalogi jako listę, a następnie .reverse(), ale to zajmie dużo czasu.

+2

Dlaczego musisz to zrobić? –

+0

ponieważ pracuję nad bardzo dużym zbiorem katalogów, które są w porządku liczbowym i chcę najpierw zobaczyć najwyższe liczby. – jdborg

Odpowiedz

15

Po pierwsze, os.walk() nie określa kolejności, w jakiej katalogi są zwracane, więc gdybym był tobą, nie powoływałbym się na kolejność alfabetyczną.

Mimo, że można wybrać kolejność, w jakiej podkatalogi pokonywane są przez pozostawiając topdown zestaw na wartość domyślną (True), a następnie sortowania dirs na miejscu:

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

To będzie zrobić os.walk() przechodzenie przez podkatalogi w odwrotnej kolejności leksykograficznej ich nazw.

documentation wyjaśnia, jak to działa:

Kiedy topdown jest True, dzwoniący może modyfikować listę dirnames w miejscu (być może przy użyciu del lub powierzenie slice) i walk() będzie tylko recurse do podkatalogów, których imiona pozostają w dirnames; może to służyć do przycinania wyszukiwania, narzucania określonej kolejności odwiedzin, a nawet informowania o katalogach, które wywołujący tworzy lub zmienia, zanim ponownie odtworzy się.

+0

Dzięki. Czytaj dokumenty przed rozdaniem, ale nie zdawałeś sobie sprawy, że oznacza to, że możesz zamawiać je w locie. – jdborg

1

Nie można odwrócić generatora w żaden ogólny sposób. Jedynym rozwiązaniem jest rzutowanie go na sekwencję i iterowanie po sekwencji w odwrotnej kolejności. Późniejsze warunki generatora niekoniecznie muszą być znane, dopóki nie zostaną obliczone wcześniejsze.

Poniższe rozwiązanie używa odwróconej. Wydajność powinna być dobra, jeśli struktura katalogów nie jest głęboka.

import os 

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

Musisz zrozumieć, że rzeczywiście można modyfikować dirs używany przez os.walk. (Przynajmniej jeśli nie ustawisz jawnie topdown=False).

W szczególności można na przykład usunąć katalogi lub uciec się do listy.

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

Powinien zrobić sztuczkę bez dodatkowych dodatkowych kosztów.

Powiązane problemy