为什么Python';s.os.walk会无声地失败吗?
我有以下资料:为什么Python';s.os.walk会无声地失败吗?,python,python-2.7,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方法的评论都会有所帮助),而更关心的是如何理解它
def crawl(rootdir):
for dir, subdir, files in os.walk(rootdir):
for file in files:
print "file found: %s" % file`
在我的理解中,如果我在不存在的rootdir上调用它,我应该会得到一个错误。相反,它似乎悄悄地失败了。我不太关心如何解决这个问题(尽管任何关于pythonic方法的评论都会有所帮助),而更关心的是如何理解它发生的原因。您阅读了文档吗?引述: 默认情况下,listdir()中的错误调用被忽略。如果指定了可选参数onerror,则它应该是一个函数;将使用一个参数OSError实例调用它。它可以报告错误以继续漫游,也可以引发异常以中止漫游。请注意,文件名作为异常对象的文件名属性可用。” 理解它背后的基本原理也很简单:在发生错误时选择做什么更为灵活,因为并非所有应用程序都会这样对待
listdir
错误。如中所述,您需要指定一个onerror
函数,该函数将OSError
作为获取错误的参数。然后你可以选择你想用它做什么。这里的其他答案都是字面意思,但我会补充我认为这种行为的动机 因为
os.walk
返回一个生成器,所以生成器为空是合理的。空生成器不一定是异常的原因(如果是,则可以通过向onerror
参数传递函数来引发异常)
然而,这个原因并不能完全回答这个问题,因为可以说默认情况下应该在初始生成器为空时抛出异常。但是,这样做将意味着无法从目录实际存在时开始提前创建生成器。此外,如果树发生更改,生成器将在运行时简单地查找新目录,即使在创建生成器时它们并不存在
即使有这些原因,我认为初始异常在这里也很有意义,因为人们可能希望遍历在生成器创建之前已经存在的目录。由于onerror
参数适用于行走过程中的任何错误,并且可以以相同的方式处理,因此这种类型的更改可能会降低实现的简化程度