簡體   English   中英

組裝遞歸函數的輸出?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM