【问题标题】:Recursively return the pathname of the file递归返回文件的路径名
【发布时间】:2012-03-14 07:55:12
【问题描述】:

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

【问题讨论】:

  • 你为什么使用try/except?我想你正在寻找if/else

标签: python file search recursion


【解决方案1】:

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

另外,正如 Brendan 所说,您应该使用 if/else,而不是 try/except,因为这里不会引发任何错误。

最后,您似乎没有基本情况(例如,没有要遍历的更多目录),这是一个终止递归并防止无限循环/递归的最终条件。

【讨论】:

    【解决方案2】:

    您可以使用 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
    

    【讨论】:

    • 我在考虑添加,但我猜老师希望他们重新发明os.walk
    • 公平点,应该收集到它是因为“要求”的分配是递归的。
    • 是的,不幸的是它必须是递归的,但我仍然遇到问题:/
    【解决方案3】:

    您需要一个递归终止条件。想想函数应该返回的条件以及它应该继续查找的条件。然后编写一个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`
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-27
      • 2019-10-25
      • 2019-12-23
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多