为什么Python的os.walk无声地失败?

时间:2014-07-25 11:59:07

标签: python python-2.7

我有以下内容:

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

根据我的理解,如果我在不存在的rootdir上调用它,我应该会收到错误。相反,它似乎悄然失败。我不太关心如何解决这个问题(尽管任何关于pythonic方式的评论都会有所帮助)以及更多地了解它为什么会发生这种情况。

3 个答案:

答案 0 :(得分:4)

您是否阅读过文档?引用:

  

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

理解它背后的基本原理也是微不足道的:选择在出现错误时要做什么要灵活得多,因为所有应用程序都不会将listdir错误视为错误。

答案 1 :(得分:2)

os.walk documentation中所述,您需要指定一个onerror函数,该函数将OSError作为参数来获取错误。
然后你可以选择你想用它做什么。

答案 2 :(得分:0)

这里的其他答案都是字面上的,但我会添加我认为是出于这种行为的动机。

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

但是,这个原因并不能完全回答问题,因为可能会说默认值应该是在初始生成器为空时引发异常。但是,这样做将意味着无法从目录实际存在的时间开始创建生成器。此外,如果树发生更改,即使生成器在创建时不存在,生成器也会在运行时简单地查找新目录。

即使有这些原因,我认为这里也应该有一个例外,因为人们可能想遍历创建生成器之前已经存在的目录。由于onerror参数适用于遍历中的任何错误,并且可以全部相同地对待,因此这种类型的更改可能会使实现的精简程度降低。