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 に答える
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 に答える