递归返回文件的路径名

时间:2012-02-23 20:48:36

标签: python file search recursion

我需要一个程序,它将文件名和文件夹的路径名作为参数,并直接或间接地搜索文件夹中的文件及其中包含的任何文件夹。该函数应返回文件的路径名(如果找到),如果在文件夹或文件夹的任何子目录中找不到该文件,则返回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. 您不会对递归调用返回的值执行任何操作。那些应该返回路径或者无,并且你没有检查回来的东西。**

3 个答案:

答案 0 :(得分:2)

您的递归元素混淆了。试试search(fname, next)

另外,正如Brendan所说,你应该使用if/else,而不是try/except,因为这里没有错误。

最后,你似乎没有一个基本情况(例如,没有其他目录可以遍历),这是一个终止递归并阻止无限循环/递归的最终条件。

答案 1 :(得分: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

答案 2 :(得分: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`