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,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
。公平地说,应该收集到的是“需求”的作业是递归的。是的,它必须是递归的不幸的是,我仍然有问题:/