Python 递归返回文件的路径名

Python 递归返回文件的路径名,python,file,search,recursion,Python,File,Search,Recursion,我需要一个程序,作为参数的文件名和文件夹的路径名,并搜索文件夹中的文件和其中包含的任何文件夹,直接或间接。如果找到该文件,函数应返回该文件的路径名;如果在文件夹或文件夹的任何子目录中找不到该文件,则函数应返回“无”。函数必须是递归的 这是我的密码: def search(fname, path): for item in os.listdir(path): next = os.path.join(path, item) try:

我需要一个程序,作为参数的文件名和文件夹的路径名,并搜索文件夹中的文件和其中包含的任何文件夹,直接或间接。如果找到该文件,函数应返回该文件的路径名;如果在文件夹或文件夹的任何子目录中找不到该文件,则函数应返回“无”。函数必须是递归的

这是我的密码:

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'
ect。 但我只能让我的代码找到fileA.txt,不管我告诉它要查找什么文件

我向老师求助,她告诉我:

**我看到了几个问题:

  • 函数中没有实际检查是否找到文件的条件。更改此项时,请参阅下一个问题
  • 如果已将路径添加到fname,则fname将与对应的文件不匹配。在创建文件的完整路径名之前,需要检查文件名,否则无法匹配它
  • 您不会对递归调用返回的值执行任何操作。这些应该返回路径或者不返回,并且您没有检查返回的是什么**

  • 您的递归元素混淆了。尝试
    搜索(fname,next)

    此外,正如Brendan所提到的,您应该使用
    if/else
    ,而不是
    try/except
    ,因为这里没有抛出错误


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

    您的递归元素是混合的。尝试
    搜索(fname,next)

    此外,正如Brendan所提到的,您应该使用
    if/else
    ,而不是
    try/except
    ,因为这里没有抛出错误

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

    您可以使用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()执行以下操作:

    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
    

    您需要一个递归终止条件。考虑函数应该返回的条件以及它应该继续查找的条件。然后编写一个
    if/else
    块来测试这些条件。如果返回条件成立,则返回正确的值。否则,返回递归调用的结果。换句话说,它应该是这样的(示意图):


    您需要一个递归终止条件。考虑函数应该返回的条件以及它应该继续查找的条件。然后编写一个
    if/else
    块来测试这些条件。如果返回条件成立,则返回正确的值。否则,返回递归调用的结果。换句话说,它应该是这样的(示意图):


    为什么要使用
    尝试
    /
    除了
    ?我想你在寻找
    如果
    /
    其他
    。你为什么要使用
    尝试
    /
    除了
    ?我想你是在寻找
    if
    /
    else
    。我想加上它,但我猜老师希望他们重新发明
    操作系统。walk
    。公平地说,应该是因为“需求”的作业是递归的。是的,不幸的是,它一定是递归的,我仍然有问题:/我正在考虑添加它,但我猜老师希望他们重新发明
    os.walk
    。公平地说,应该收集到的是“需求”的作业是递归的。是的,它必须是递归的不幸的是,我仍然有问题:/