我正在尝试编写一个函数,该函数将在目录树中搜索“已搜索”目录并返回其路径,当找到目录时它应该停止,但是不是,我的错误在哪里? / p>
import os
searched = "NodeBook"
def find(Path, searched):
print("Searching in " + os.path.normpath(Path))
for filePath in os.listdir(Path):
if ((filePath == searched) and (os.path.isdir(os.path.join(Path, filePath)))) :
print("Found")
print(filePath)
print(os.path.join(Path, filePath))
return os.path.join(Path, filePath)
elif (os.path.isdir(filePath)) :
find(os.path.join(Path, filePath), searched)
find( "./", searched)
我希望这样:
Searching in .
Searching in nodeLearning
Searching in nodeParse
Searching in Screeps
Found
NodeBook
但是我有:
Searching in .
Searching in nodeLearning
Searching in nodeParse
Searching in Screeps
Found
NodeBook
./Screeps\NodeBook
Searching in testpython
Searching in testReact
Searching in testReact\testreact
它遍历所有子目录。
答案 0 :(得分:0)
此函数正在调用自身:
elif (os.path.isdir(filePath)) :
find(...)
好的,但这是在循环中发生的,因此在此调用返回后,循环将继续。您应该重新考虑逻辑:也许您可以检查返回值,然后在指示有效路径的情况下返回它,否则继续循环。
例如,现在什么都没发现,该函数将返回None
,因此您可以检查返回值是否为None
:
ret = find(...)
if ret is not None:
return ret
# continue looping otherwise
答案 1 :(得分:0)
您有一些小问题。
错误1 :您看到的是isdir(filePath)
而不是isdir(os.path.join(Path, filePath))
。如果您的文件不是与您的起始位置的目录同名的目录,则可能导致错误。例如
/tmp/a <-- dir
/tmp/b <-- dir
/tmp/b/a <-- file
会给OSError
错误2 :如果您在递归调用中找到匹配项,就不会停止 您可以通过多种方式解决此问题,可以通过检查递归调用中的返回值来选择解决此问题。
错误3 :我认为如果遇到形成循环的符号链接,这种情况可能会永远消失。没有解决,但您应该决定如何处理。
为了清楚起见,我还重命名了一些内容。
import os
def find_subdir(base_dir, search):
print("Searching in " + os.path.normpath(base_dir))
for name in os.listdir(base_dir):
path = os.path.join(base_dir, name)
if not os.path.isdir(path):
continue
if name == search:
return path
sub_search = find_subdir(path, search)
if sub_search is not None:
return sub_search
return None # For clarity
result = find_subdir( "./", "NodeBook")
if result is not None:
print("Found")
print(result)