[英]Assembling output from a recursive function?
我試圖遍歷目錄和其中的任何嵌套目錄。 似乎遞歸將是解決此問題的好方法。
我最終得到了這段代碼:
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
所以現在的問題是,它僅返回當前工作目錄中的文件。 經過一番思考,我想這是一個范圍界定的問題。 每次調用get_file_list()
時,都會在唯一的內存中創建一個新的files
變量,對嗎? 那么,如何解決這樣的問題? 您如何組合嵌套調用的結果?
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
我認為會更好
使用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()
調用更改為just .
因為您可能希望它默認為當前當前工作目錄,而不是定義函數時的工作目錄。
使用發電機! 它們非常強大,並且易於閱讀。 這里有一些 參考 。
基本上,您使用“ yield”返回值而不是“ return”。 當函數遇到“ yield”語句時,它將返回值並暫停函數的執行 ,這意味着稍后再調用該函數時,它將在中斷處繼續執行 !
最重要的是,您可以告訴python使用“ for my_generator_function()中的x”遍歷生成器函數。 非常便利。
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 ;)
按照原始問題的精神, 遞歸執行此操作的一種常用方法是將要附加的列表作為參數傳遞。 將空列表傳遞給函數的第一個調用。 遞歸“幫助器”(通常實現為嵌套函數)可以累積文件。
編輯 :
這是完整的腳本(從以前的版本修復):
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()
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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.