如何以递归方式将元素添加到列表中,而不会在每次递归调用时将列表重置为空?

时间:2019-04-16 01:45:25

标签: python list recursion directory

我试图递归地遍历目录和子目录,以找到母目录中的所有文件。

这是针对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 :(得分:0)

当您递归调用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)