我试图遍历目录和其中的任何嵌套目录。似乎递归是一种很好的方式。
我最终得到了这段代码:
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()
变量,对吧?那么你怎么解决这样的事情呢?如何汇编嵌套调用的结果?
答案 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)
使用发电机!它们非常强大,易于阅读。 Here为some 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))