我有以下内容:
def crawl(rootdir):
for dir, subdir, files in os.walk(rootdir):
for file in files:
print "file found: %s" % file`
根据我的理解,如果我在不存在的rootdir上调用它,我应该会收到错误。相反,它似乎悄然失败。我不太关心如何解决这个问题(尽管任何关于pythonic方式的评论都会有所帮助)以及更多地了解它为什么会发生这种情况。
答案 0 :(得分:4)
您是否阅读过文档?引用:
“默认情况下,listdir()调用中的错误被忽略。如果指定了可选的参数onerror,它应该是一个函数;它将使用一个参数,一个OSError实例调用。它可以报告错误以继续walk,或引发异常以中止walk。请注意,文件名可用作异常对象的filename属性。“
理解它背后的基本原理也是微不足道的:选择在出现错误时要做什么要灵活得多,因为所有应用程序都不会将listdir
错误视为错误。
答案 1 :(得分:2)
如os.walk documentation中所述,您需要指定一个onerror
函数,该函数将OSError
作为参数来获取错误。
然后你可以选择你想用它做什么。
答案 2 :(得分:0)
这里的其他答案都是字面上的,但我会添加我认为是出于这种行为的动机。
因为os.walk
返回一个生成器,所以将生成器为空是合理的。空生成器不一定会导致异常(如果是,则可以通过将函数传递给onerror
参数来引发异常)。
但是,这个原因并不能完全回答问题,因为可能会说默认值应该是在初始生成器为空时引发异常。但是,这样做将意味着无法从目录实际存在的时间开始创建生成器。此外,如果树发生更改,即使生成器在创建时不存在,生成器也会在运行时简单地查找新目录。
即使有这些原因,我认为这里也应该有一个例外,因为人们可能想遍历创建生成器之前已经存在的目录。由于onerror
参数适用于遍历中的任何错误,并且可以全部相同地对待,因此这种类型的更改可能会使实现的精简程度降低。