2010-11-07 9 views
18

Poszukuję sposobu na zrobienie nierekurencyjnego spaceru os.walk(), podobnie jak w przypadku prac os.listdir(). Ale muszę powrócić w taki sam sposób, jak zwraca os.walk(). Dowolny pomysł?Nierekurencyjne os.walk()

Z góry dziękuję.

Odpowiedz

24
next(os.walk(...)) 
+0

Bardziej proste niż mogłoby się wydawać ... Dziękuję! –

4

My nieco bardziej sparametryzowane rozwiązaniem byłoby to:

for root, dirs, files in os.walk(path): 
    if not recursive: 
     while len(dirs) > 0: 
      dirs.pop() 

    //some fency code here using generated list 

EDIT: poprawki, jeśli/gdy problem. Dzięki, @Dirk van Oosterbosch:}

+4

Działa to tylko wtedy, gdy istnieje ** jeden ** podkatalog. W przypadku wielu podkatalogów użyj 'while len (dirs)> 0' zamiast' if'. –

+0

@DirkvanOosterbosch: lub jeszcze prostsze: po prostu 'jeśli nie rekurencyjne: break' Niepowiązane: możesz użyć' del dirs [:] 'zamiast' while dirs: dirs.pop() '. – jfs

+0

Użycie 'dirs.clear()' jest bardziej idiomatyczne. – ideasman42

0

No co Kamiccolo oznaczało był bardziej zgodny z tym:

for str_dirname, lst_subdirs, lst_files in os.walk(str_path): 
    if not bol_recursive: 
      while len(lst_subdirs) > 0: 
       lst_subdirs.pop() 
4

Dodaj break po nazwach pętli for:

for root, dirs, filenames in os.walk(workdir): 
    for fileName in filenames: 
     print (fileName) 
    break #prevent decending into subfolders 

To działa, ponieważ (domyślnie) os.walk najpierw wyświetla pliki w żądanym folderze, a następnie przechodzi do podfolderów.

Powiązane problemy