2014-01-03 2 views
1

У меня есть следующий код, но он пересекает 1-й каталог, который он находит и останавливается. Я чувствую, что у меня есть рекурсивная функция, которая должна была дать и другие каталоги. Может кто-нибудь указать, что не так с этим кодом.Код Python для рекурсии для печати каталогов

def func(path,no): 
    no=no+2 
    for item in os.listdir(path): 
     if os.path.isfile(path+"\\"+item): 
      print no * "-" + " " + item 
     if os.path.isdir(path+"\\"+item): 
      path=path + "\\" + item 
      print no * "-" + " " + item 
      func(path,no) 


path="D:\\Hello" 
no=0 
func(pah,no) 

ВЫВОД:

-- 1.txt 
-- 2.txt 
-- 3.txt 
-- blue 
---- 33.txt 
---- 45.txt 
---- 56.txt 
---- Tere 

"синий" & "Tere" являются каталоги. В папке «HELLO» есть больше каталогов, которые не печатаются.

ответ

3

Это потому, что вы измените значение path на path + "\\" + item, когда вы сначала найти каталог. Затем os.path.isfile(path+"\\"+item) и os.path.isdir(path+"\\"+item) все возвращается False.

Это должно быть так:

def func(path,no): 
    no=no+2 
    for item in os.listdir(path): 
     if os.path.isfile(path+"\\"+item): 
      print no * "-" + " " + item 
     if os.path.isdir(path+"\\"+item): 
      print no * "-" + " " + item 
      func(path + "\\" + item,no) 
5

Чтобы пройти через каталоги recursivly, используйте os.walk

import os 

path = r'path\to\root\dir' 
for root, dirs, files in os.walk(path): 
    # Access subdirs and files 

На другой ноте:

  1. Чтобы присоединиться к части пути вместе, используйте os.path.join. Итак, вместо path+"\\"+item вы можете использовать os.path.join(path, item). Это будет работать на всех платформах, и вам не нужно думать об исключении косых черт и т. Д.
  2. Лучшим способом печати значений является использование метода format. В вашем случае вы можете написать

    print '{} {}'.format(no*'-', item)` 
    

    вместо

    print no * "-" + " " + item 
    
+0

Мой код должен также печатали каталоги? Можете ли вы рассказать мне, в чем проблема? –

+0

@VinodK Проверьте ответ Литей. Вы изменяете переменную пути, а затем прыгаете глубже в рекурсию. Когда вы возвращаетесь с этого вызова, путь изменяется, а остальная часть цикла for больше не имеет смысла. –

Смежные вопросы