2011-07-12 13 views
15

Chciałbym wiedzieć, czy można zmusić os.walk w python3 do odwiedzenia katalogów w porządku alfabetycznym. Na przykład, tutaj jest katalogiem, a niektóre kod, który poprowadzi ten katalog:Czy mogę zmusić os.walk Pythona do odwiedzenia katalogów w kolejności alfabetycznej? w jaki sposób?

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) 

Gdy kod Pythona uderza katalogu wyżej, tu jest wyjście:

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

Chciałbym wymusić spacer do odwiedzenia tych katalogów w porządku alfabetycznym, 01, 02 ... 05. W python3 doc for os.walk, to mówi:

Kiedy topdown to prawda, że ​​dzwoniący może modyfikować listę dirnames w miejscu (być może przy użyciu del lub przypisanie Slice) oraz spacer() będzie tylko recurse do podkatalogów, których imiona pozostają w nazwiskach; ten może być stosowany do przycinać wyszukiwanie, narzucać konkretnej kolejności zwiedzania

Czy to znaczy, że mogę nałożyć alfabetyczna odwiedzając os.walk? Jeśli tak to jak?

Odpowiedz

26

Tak. Sortujesz katalogi w pętli.

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

, więc to całkiem niesamowite. Myślałem, że jedyną rzeczą, którą możesz zrobić z generatorami, jest ich powtarzanie. –

+0

@ryan_m: To * jest * wszystko, co możesz zrobić. Ale ponieważ następny krok w iteracji nie jest generowany, dopóki nie skończysz z pierwszym, pozwala to na takie sztuczki. :-) –

+0

fajny hack! :-) ~ –

0

Wiem, że to już zostało odebrane, ale chciałem dodać jeden mały detal i dodanie więcej niż jednej linii kodu w komentarzach jest niewiarygodne.

Oprócz tego, że chciałbym posortować katalogi, chciałem również posortować pliki tak, aby moja iteracja za pomocą "gl" była spójna i przewidywalna. Aby to zrobić, wymagany był jeszcze jeden rodzaj:

for root, dirs, files in os.walk(gl): 
    dirs.sort() 
    for filename in sorted(files): 
    print(os.path.join(root, filename)) 
Powiązane problemy