Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Python';s.os.walk会无声地失败吗?_Python_Python 2.7 - Fatal编程技术网

为什么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
参数适用于行走过程中的任何错误,并且可以以相同的方式处理,因此这种类型的更改可能会降低实现的简化程度