2012-02-23 3 views
0

Мне нужна программа, которая принимает в качестве параметров имя файла и путь к папке и ищет файл в папке и в любой папке, содержащейся в нем, прямо или косвенно. Функция должна возвращать путь к файлу, если найден, или None, если файл не может быть найден в папке или в любом подкаталоге папки. Функция должна быть рекурсивной.Рекурсивно возвращать путь к файлу

вот мой код:

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. Вы ничего не делаете со значениями, возвращаемыми из рекурсивного вызова. Они должны возвращать либо пути, либо Нет, и вы не проверяете, что возвращается. **
+1

Почему вы используете 'try' /' except'? Я думаю, что вы ищете 'if' /' else'. –

+0

пожалуйста, уточните? – AngelE

ответ

2

Ваши элементы рекурсии перемешаны. Попробуйте search(fname, next).

Также, как упоминалось Бренданом, вы должны использовать 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

+0

Справедливая точка, должна была собраться, чтобы присвоить «требование» было рекурсивным. – aravenel

+0

да, к сожалению, он должен быть рекурсивным, и у меня все еще возникают проблемы: / – AngelE

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`