2012-02-23 51 views
0

我需要一個程序,它將文件名和文件夾的路徑名作爲參數,並直接或間接地搜索文件夾及其中包含的文件夾中的文件。該函數應該返回文件的路徑名(如果找到),或者如果在文件夾或文件夾的任何子目錄中找不到該文件,則返回無。該函數必須是遞歸的。遞歸地返回文件的路徑名

這裏是我的代碼:

def search(fname, path): 

    for item in os.listdir(path): 
     next = os.path.join(path, item) 
     try: 
      search(next,fname) 
     except: 
      return next 

它應該看起來像沿着線的東西:

>>>search('fileA.txt', 'test') 
'test\\fileA.txt' 
>>>search('fileB.txt', 'test') 
'text\\folder2\\fileB.txt' 

等。 但我只能讓我的代碼找到fileA.txt,不管我告訴它找什麼文件。

我問老師一些幫助,這就是她告訴我說:

**我看到幾個問題:

  1. 你不必在你的函數的條件,實際上檢查看看你是否找到了這個文件。在改變這一點時,請參閱下一個問題。
  2. 如果您已將路徑添加到該文件,則fname將與其對應的文件不匹配。在創建文件的完整路徑名之前,您需要檢查文件名,否則您將無法匹配它。
  3. 你不會對從遞歸調用返回的值做任何事情。那些應該返回路徑或None,並且您不檢查返回的內容。**
+1

你爲什麼用'try' /'except'?我想你正在尋找'if' /'else'。 – 2012-02-23 20:52:07

+0

請詳細說明一下? – AngelE 2012-02-23 20:53:44

回答

2

您的遞歸元素混淆在一起。嘗試search(fname, next)

此外,正如Brendan所述,您應該使用if/else而不是try/except,因爲這裏沒有錯誤發生。最後,你似乎沒有基本情況(例如,沒有更多的目錄可以遍歷),這是一個終止遞歸併阻止無限循環/遞歸的最終條件。

1

你可以使用os.walk()來做到這一點:

import os 

def search(fname, path): 
    for root, dirs, files in os.walk(path): 
     if fname in files: 
      return os.path.join(root, file) 
     else: 
      return None 
+0

我想補充一點,但我猜老師希望他們改造'os.walk'。 – Edwin 2012-02-23 20:57:57

+0

公平點,應該收集它是由「要求」的遞歸遞歸。 – aravenel 2012-02-23 21:00:47

+0

是啊,它必須是遞歸不幸的是,我仍然有問題:/ – AngelE 2012-02-24 20:16:39

0

你需要一個遞歸終止條件。考慮函數應該返回的條件以及它應該繼續查找的條件。然後寫一個if/else塊來測試這些條件。如果返回條件成立,則返回正確的值。否則,返回遞歸調用的結果。換句話說,它應該看起來像這樣(示意圖):

def search(old_args) 
    if condition: 
     return 'value' # recursion terminates and value is returned 
    else:    # all the way down the call stack 
     return search(new_args) # continue recursion until `condition` holds & 
           # pass the result down the stack with `return`