Рекурсивно вернуть путь к файлу - PullRequest
0 голосов
/ 24 февраля 2012

Мне нужна программа, которая принимает в качестве параметров имя файла и путь к папке и ищет файл в папке и любой папке, содержащейся в ней, прямо или косвенно. Функция должна возвращать путь к файлу, если он найден, или 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. Имя не будет соответствовать файлу, который ему соответствует, если вы уже добавили путь к нему. Вам нужно проверить имя файла, прежде чем создавать полный путь к файлу, иначе у вас не будет способа его сопоставить.
  3. Вы ничего не делаете со значениями, которые возвращаются из рекурсивного вызова. Они должны возвращать либо пути, либо None, и вы не проверяете, что возвращается. **

Ответы [ 3 ]

2 голосов
/ 24 февраля 2012

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

Также, как упомянул Брендан, вы должны использовать if/else, а не try/except, поскольку здесь не выдается никаких ошибок.

И, наконец, у вас, похоже, нет базового случая (например, нет дальнейших каталогов для прохождения), конечного условия, которое завершит рекурсию и предотвратит бесконечный цикл / рекурсию.

1 голос
/ 24 февраля 2012

Вы можете использовать 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 голосов
/ 24 февраля 2012

Вам нужно условие завершения рекурсии. Подумайте об условиях, при которых функция должна возвращаться, и об условиях, при которых она должна продолжаться. Затем напишите блок 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`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...