通常、これは宿題のようなにおいがするため、完全な解決策を提供しません (これが私が回避している理由でもありos.walk
ます) が、あなたが試みを投稿したので、ここに説明と解決策があります:
まず、 を呼び出すたびfindAll
に を初期化しますlst
。確かに、最後にそれを返しますが、戻り値には何もしないので、効果lst.append
は再帰内に含まれているため、外部には表示されません。これを説明する図を描いてみましょう (1 レベルの再帰を使用)。
+--------------------------------------------------+
|Outer Level: |
| |
|`lst = []` |
|found file f1 with name fname |
|`lst.append(f1)` |
|+------------------------------------------------+|
||Inner Level ||
|| ||
||`lst=[]` ||
||found file f2 with name fname ||
||`lst.append(f2)` ||
||`return lst` ||
|+------------------------------------------------+|
|a list is returned from recursive call, |
|but not assigned to a variable. |
|Therefore, `lst` remains unchanged |
+--------------------------------------------------+
これを修正するには、いくつかの方法があります。
lst
外部のスコープに移動しますfindAll
(個人的には、これが私がすることです)
- 再帰呼び出しからの戻り値を使用して変更します
lst
lst
外部のスコープに移動するfindAll
lst= []
def findAll(fname, path):
global lst
for item in os.listdir(path):
n = os.path.join(path, item)
try: # really though, you don't need to use try/except here
if item == fname:
lst.append(n)
else:
findAll(fname,n)
except:
pass
findAll
が終了した後lst
、必要な値が含まれます
再帰呼び出しからの戻り値を使用して変更しますlst
def findAll(fname, path, answer=None):
if answer == None:
answer = []
for item in os.listdir(path):
n = os.path.join(path, item)
try:
if item == fname:
answer += [n]
except:
findAll(fname,n, answer)
return answer
お役に立てれば
PS:もちろん、これを行うための宿題以外の方法は、次を使用することos.walk
です:
answer = []
def findAll(fname, dirpath):
dirpath, dirnames, filenames = os.walk(dirpath)
for filename in filenames:
if filename == fname:
answer.append(os.path.join(dirpath, filename))
for dirname in dirnames:
findAll(fname, os.path.join(dirpath, dirname))
# now, answer contains all the required filepaths
編集:OPは、グローバル変数を使用しないバージョンを要求しました:
def findAll(fname, root, answer=None):
if answer == None:
answer = []
for entry in os.listdir(root):
if os.path.isdir(os.path.join(root, entry)):
answer += findAll(fname, os.path.join(root, entry))
else:
if entry == fname:
answer.append(os.path.join(root, entry))
return answer