为什么我的功能没有停止在“返回”行?

时间:2019-06-14 19:34:14

标签: python

我正在尝试编写一个函数,该函数将在目录树中搜索“已搜索”目录并返回其路径,当找到目录时它应该停止,但是不是,我的错误在哪里? / 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

它遍历所有子目录。

2 个答案:

答案 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)