Как добавить элементы в список без рекурсивного сброса списка при каждом рекурсивном вызове? - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь рекурсивно перебрать каталоги и подкаталоги, чтобы найти все файлы в родительском каталоге.

Это для Python 3. Я попытался проверить, является ли данный путь каталогом или файлом. Если это файл, я добавляю путь к списку, а если это каталог, я вызываю функцию обратно к нему, чтобы он мог добавить любые файлы в этом списке, чтобы получить полный список путей к файлам в первом каталоге.

import os,csv,json
def find_file(path):
    paths = []
    if os.path.isdir(path):
        cont = os.listdir(path)
        for x in cont:
            if os.path.isfile(os.path.join(path,x)):
                if x.startswith("."):
                    continue
                paths.append(os.path.join(path,x))
            if os.path.isdir(os.path.join(path,x)):
                find_file(os.path.join(path,x))
    else:
        paths.append(path)
    return(paths)

Что происходит, так это то, что он возвращает все элементы файла из непосредственного материнского каталога, но если в материнском каталоге есть каталоги, ни один из файлов из этого каталога не окажется в списке.

1 Ответ

0 голосов
/ 16 апреля 2019

Когда вы вызываете find_file рекурсивно, вы должны добавить все его результаты к paths.

import os,csv,json
def find_file(path):
    paths = []
    if os.path.isdir(path):
        cont = os.listdir(path)
        for x in cont:
            if os.path.isfile(os.path.join(path,x)):
                if x.startswith("."):
                    continue
                paths.append(os.path.join(path,x))
            if os.path.isdir(os.path.join(path,x)):
                paths += find_file(os.path.join(path,x))
    else:
        paths.append(path)
    return(paths)

Другой способ сделать это - передать paths в качестве аргумента.

import os,csv,json
def find_file(path, paths = None):
    if paths is None:
        paths = []
    if os.path.isdir(path):
        cont = os.listdir(path)
        for x in cont:
            if os.path.isfile(os.path.join(path,x)):
                if x.startswith("."):
                    continue
                paths.append(os.path.join(path,x))
            if os.path.isdir(os.path.join(path,x)):
                find_file(os.path.join(path,x), paths)
    else:
        paths.append(path)
    return(paths)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...