从递归函数中组装输出?

时间:2013-05-20 02:28:24

标签: python

我试图遍历目录和其中的任何嵌套目录。似乎递归是一种很好的方式。

我最终得到了这段代码:

def get_file_list(directory=os.getcwd()):
    for i in os.listdir(directory):
        if os.path.isdir(i):
            get_file_list(i)
            continue
        print i

这个打印一切都很漂亮 - 完全是我期望的输出。但是,我想获取此文件列表并将其传递给另一个函数以进行进一步处理。所以我尝试将所有内容编译成一个列表。

def get_file_list(directory=os.getcwd()):
    files = []
    for i in os.listdir(directory):
        if os.path.isdir(i):
            get_file_list(i)
            continue
        files.append(i)
    return files

现在,问题是它只返回当前工作目录中的文件。经过一番思考后,我猜这是一个范围问题。每次调用files时,都会在唯一的内存中创建一个新的get_file_list()变量,对吧?那么你怎么解决这样的事情呢?如何汇编嵌套调用的结果?

5 个答案:

答案 0 :(得分:4)

all_files =[]
for current_dir,files,directories in os.walk("C:\\"):
      current_files = [os.path.join(current_dir,file) for file in files]
      all_files.extend(current_files)


print all files

我认为会更好用

答案 1 :(得分:3)

使用extend

def get_file_list(directory='.'):
    files = []
    for i in os.listdir(directory):
        if os.path.isdir(i):
            files.extend(get_file_list(i))
        else:
            files.append(i)
    return files

另外,我将os.getcwd()调用更改为.,因为您可能希望将其默认为当前当前工作目录,而不是当前工作目录中的工作目录功能定义了。

答案 2 :(得分:2)

使用发电机!它们非常强大,易于阅读。 Heresome references

基本上,您使用“yield”来返回值而不是“return”。当函数遇到“yield”语句时,它返回值并且暂停函数的执行,这意味着当稍后再次调用该函数时,它会从中断的地方继续!< /强>

最重要的是,你可以告诉python使用“for my in mygenener_function()”迭代生成器函数。非常方便。

import os


#this is a "generator function"
def get_files(directory='.'):
    for item in os.listdir(directory):
        item = os.path.join(directory, item)
        if os.path.isdir(item):
            for subitem in get_files(item):
                yield subitem
                # The fact that there's a "yield" statement here
                #     tells python that this is a generator function
        else:
            yield item

for item in get_files():
    print item  # Do something besides printing here, obviously ;)

答案 3 :(得分:1)

根据原始问题的精神,以递归执行此操作的常用方法是将要附加的列表作为参数传递。将空列表传递给第一次调用该函数。递归“帮助器”(通常作为嵌套函数实现)可以累积文件。

修改

这是一个完整的脚本(从以前的版本修复):

import os

def get_file_list(directory=os.getcwd()):
    def file_list(directory, files):
        for i in os.listdir(directory):
            if os.path.isdir(i):
                file_list(i, files)
                continue
            files.append(i)
        return files
    return file_list(directory, [])

print get_file_list()

答案 4 :(得分:0)

import os
def get_file_list(files,directory=os.getcwd()):
    for i in os.listdir(directory):
        if os.path.isdir(i):
            get_file_list(files,i) #note me needed to amend this call to pass the reference down the calls
            continue
        files.append(i) #insert the file name into our referenced list.

myfiles = [] #the list we want to insert all the file names into
get_file_list(myfiles) #call the function and pass a reference to myfiles in
print('\n'.join(myfiles))