0

我正在尝试遍历目录和其中的任何嵌套目录。似乎递归将是一个很好的方法。

我最终得到了这段代码:

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()调用时都会在一块唯一的内存中创建一个新变量,对吗?那么你如何解决这样的问题呢?你如何组合嵌套调用的结果?

4

5 回答 5

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

我认为会更好

于 2013-05-20T02:30:30.173 回答
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()调用更改为只是.因为您可能希望它默认为当前的当前工作目录,而不是定义函数时的工作目录。

于 2013-05-20T02:37:59.337 回答
2

使用发电机!它们非常强大,使事情易于阅读。这里一些 参考

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

最重要的是,您可以告诉 python 使用“for x in my_generator_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 ;)
于 2013-05-20T03:19:26.583 回答
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()
于 2013-05-20T02:30:43.580 回答
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))
于 2013-05-20T02:35:05.833 回答