繁体   English   中英

如何使用递归列出目录和子目录中的现有文件?

[英]how do i list existing files in a directory and subdirectories using recursion?

我想知道是否可以将所有文件放入一个列表中,即使它们存在于不同的子目录中而不使用 os.walk

我编写的 function 可以完成这项工作,但我不希望文件显示在嵌套列表中。 我需要它们在一个列表中。

import os

def cerca(dir1): 
    
    lista1 = [] 
    for fname in os.listdir(dir1): 
        path = os.path.join(dir1,fname)
        if fname.startswith('.') : continue 
        if os.path.isfile(path): 
            lista1.append(fname)
    return lista1

def directory(dir1): 
    
    lista2 = cerca(dir1) 
    for fname in os.listdir(dir1): 
        path = os.path.join(dir1,fname) 
        if os.path.isdir(path): 
            ret = directory(path)
            lista2.append(ret)  
    return lista2 


output = [['looney-tunes.txt', [[['minnie.txt']]]], ['minnie.txt', ['looney-tunes.txt']],[['minnie.txt'], [['looney-tunes.txt']]]]

output 应该是:

['looney-tunes.txt','minnie.txt','minnie.txt','looney-tunes.txt','minnie.txt','looney-tunes.txt']

任何帮助将不胜感激

目前,您只使用list.append方法,这就是您获得嵌套列表的原因。 如果使用list.extend方法,则不需要展平列表:

def walk(root):
    files = []
    for e in os.listdir(root):
        path = os.path.join(root, e)
        print(path)
        if os.path.isfile(path):
            files.append(e)
        else:
            files.extend(walk(path))

    return files

然后像这样调用 function:

root = "path-to-directory"
files = walk(root)

首先,我们需要初始化一个空列表, files ,以便我们可以跟踪已经迭代的文件。 现在我们只需要使用os.listdir列出文件并简单检查它是文件还是目录。

如果它是一个文件, list.append就可以了。

如果它是一个目录,我们需要使用list.extend因为如果你 append 一个列表到一个列表,你只会得到嵌套列表,如下所示:

files = ["top_file.txt", ["nested_file_0.txt", "nested_file_1.txt"]]

使用extend,我们得到了这样的东西:

files = ["top_file.txt", "nested_file_0.txt", "nested_file_1.txt"]

我不知道您为什么不想使用os.walk ,因为它是递归列出目录内容的最有效方式。 如果您真的不能使用os.walk (无论出于何种原因),请不要注意这个答案。 但是如果你可能考虑使用os.walk ,我做了一个例子,

import os

def walk(path):
    filelist = []
    for root, dirs, files in os.walk(path):
        filelist.append(list(filter(None, root.split(os.path.sep)))[-1]) # get the directory name we are currently in without the path and append it to the list
        filelist.extend(dirs + files) # extend the list  with the directories and files
    return filelist

要获得一个平面列表而不必展平它,您必须使用list.extend而不是list.append

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM