我需要一个程序,它将文件名和文件夹的路径名作为参数,并直接或间接地搜索文件夹中的文件及其中包含的任何文件夹。该函数应返回文件的路径名(如果找到),如果在文件夹或文件夹的任何子目录中找不到该文件,则返回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,无论我告诉它寻找什么文件。
我问老师一些帮助,这就是她告诉我的:
**我看到了几个问题:
答案 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`