2011-12-18 2 views
0

なぜこの再帰関数は、なぜ、それが新しい発見を既存の辞書に追加しないのかを循環するたびに1つ以上の辞書を返すことです。python関数がより多くのdictを返す

ない

と私はos.walkを使用したくないとはい私は認識してtheresのノーリターン

def retFiles(dir): 
    data = {} 
    root = set() 
    os.chdir(dir) 
    cwd = os.getcwd() 
    for i in os.listdir(cwd): 
     if os.path.isfile(i): 
      data.setdefault(i, set()) 
      root.add(os.path.relpath(dir).replace("\\", "/")) 
      data[i] = root 
     else: 
      retFiles(i) 
    print(data) 
+0

うわー、このコードは混乱しています。正確に何を達成したいですか? –

+0

[python recursive directory reading]の複製が可能です(http://stackoverflow.com/questions/8552131/python-recursive-directory-reading) –

答えて

2

辞書を同じ辞書に保存するパラメータとして辞書を渡すか、returnを使用して前回の呼び出しの結果として得られた辞書を使用します。

どちらの方法でも、すべての再帰呼び出しと同じ再帰関数は同じデータを処理する必要があります。そうでない場合は無駄です。

+0

それでは、関数の最後にreturn文を追加するだけですか? –

+0

はい、返された結果を使用して前のdictに組み込む –

+0

私はその機能を実行してから、指定されたフォルダに1を返します。私は関数の最後にすべてのデータを返しますうまく動作しますが、ファイルが1つのみ返されます –

3

あなたはdata = {}を設定retfiles()への各呼び出しで新しい辞書を作成していると思いませんなし。したがって、呼び出し側のスコープにある辞書dataを追加することはできません。

+0

どうすればこの問題を解決できますか? –

+0

あなたの問題はどこですか? –

3

あなたのソリューションは、いくつかの問題があります:

1)を再帰呼び出しは、ループ中にディレクトリを変更します。残りのファイル/ディレクトリのフォルダを切り替えたため)(任意のより多くのを発見したことはありません。解決策:完全なパスを使用してファイルをアドレス指定し、現在のディレクトリを変更しないでください。

2)既に説明したように、e-satisとtimによって、あなたはdictを返すか、引数として渡す必要があります。

あなたの問題はまだ他の推論の誤りがあると思います。あなたの機能で何を達成したいのですか?

関連する問題