为什么Python的os.walk会默默失败?

3

我有以下内容:

def crawl(rootdir):
    for dir, subdir, files in os.walk(rootdir):
        for file in files:
            print "file found: %s" % file`

在我看来,如果我在不存在的根目录上调用此方法,应该会出现错误。但实际情况是它似乎悄无声息地失败了。虽然任何有关一种Pythonic方式解决这个问题的评论都会有所帮助,但我更关心的是为什么会发生这种情况。

3个回答

5

您阅读了文档吗?引用如下:

"默认情况下,忽略listdir()调用的错误。如果指定了可选参数onerror,则应该是一个函数;它将使用一个参数,即OSError实例进行调用。它可以报告错误以继续遍历,或引发异常以中止遍历。请注意,文件名可作为异常对象的filename属性获得。"

理解其背后的原理非常简单:选择在出现错误时做什么更加灵活,因为并非所有应用程序都将listdir错误视为此类错误。


2
os.walk 文档 中所述,您需要指定一个接受 OSError 参数的 onerror 函数来获取错误信息。
然后您可以选择要对其进行什么操作。

0

这里的其他答案都是直观的,但我会加上我认为这种行为的动机。

由于os.walk返回生成器,因此生成器为空是合理的。空生成器不一定会引起异常(如果确实如此,则可以通过将函数传递给onerror参数来引发异常)。

然而,这个原因并不能完全回答问题,因为有人可能会说,如果初始生成器为空,那么默认应该抛出一个异常。但是,这样做意味着无法提前从目录存在的时候创建生成器。此外,如果树发生变化,生成器将在运行时简单地找到新目录,即使它们在生成器创建时不存在。

即使有这些原因,我认为在这里进行初始异常处理也很有意义,因为人们可能希望在生成器创建之前遍历一个已经存在的目录。这种类型的更改可能会使实现变得不太流畅,因为onerror参数适用于沿着路径所有的错误,可以全部被相同处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接