2015-11-22 8 views
1

Что было бы хорошим способом получить рекурсивную функцию для создания списка для возврата? Скажем, у меня есть функция, как следующее для создания списка файлов и каталогов на все подкаталоги:Как сделать рекурсивную функцию, которая строит список

def print_directory_listing(directory = "."):       
    for file_structure in os.listdir(directory):     
     file_structure_path = os.path.join(directory, file_structure) 
     if os.path.isdir(file_structure_path): 
      print_directory_listing(file_structure_path) 
     else: 
      print(file_structure_path) 

Вместо того, распечатав все, как я мог бы изменить это, чтобы вернуть список всех файлов и директорий ? Например, было бы хорошо иметь глобальный список, к которому функция добавляет файлы?

Обратите внимание, что я не запрашиваю подробные сведения о os.walk; Я задаю общий вопрос о том, каким путинским способом было бы получить рекурсивную функцию для построения и возврата списка.

+1

Почему вы не используете 'os.walk()', который именно для этой цели? – Kasramvd

+1

@ Kasramvd Почему вы не отвечаете вместо комментария, так как это определенно ответ? –

+0

@ Loïc Потому что этот вопрос повторяется. – Kasramvd

ответ

0

Благодаря вашему комментарию, я думаю, поняв реальную цель вашего вопроса. Если вы посмотрите на следующий код, вы найдете рекурсию, которую вы ищете, и вы увидите, как «сохранить переменные дочерних элементов».

import os 

def print_directory_listing(directory = '.'): 
    files_list=[] 

    for file_structure in os.listdir(directory):     
     file_structure_path = os.path.join(directory, file_structure) 
     if os.path.isdir(file_structure_path): 
      files_list+=print_directory_listing(file_structure_path) 
     else: 
      files_list.append(file_structure_path) 

    return files_list 
+0

Спасибо за ваше решение. Мой вопрос не связан конкретно с созданием списка каталогов; речь идет о том, как получить рекурсивную функцию для построения списка и вернуть этот список. – d3pd

+0

У меня есть пример кода для вас, я не могу добавить ответ на вопрос. Закрыто. Вы зададите новый вопрос? – ozy

+0

@ d3pd Я только что обновил свой ответ – rsm