os.walk 的迭代在 Python 3 中如何工作?

use*_*730 1 python python-3.x

根据 Python 3文档, os.walk返回一个 3 元组。但是,这不起作用:

root, dirs, files = os.walk('path')
Run Code Online (Sandbox Code Playgroud)

这也不:

(root, dirs, files) = os.walk('path')
Run Code Online (Sandbox Code Playgroud)

它总是产生:

ValueError: not enough values to unpack (expected 3, got 1)
Run Code Online (Sandbox Code Playgroud)

我发现的所有示例都os.walk嵌入os.walk在 for 循环中:

for root, dirs, files in os.walk('path'):
Run Code Online (Sandbox Code Playgroud)

为什么?这里到底要迭代什么?root是字符串,dirsfiles列表。然而,大多数示例都会再次迭代dirsfiles

for root, dirs, files in os.walk('path'):
    for name in files:
        print(name)
    for name in dirs:
        print(name)
Run Code Online (Sandbox Code Playgroud)

内部 for 循环对我来说很有意义,但我不明白外部 for 循环的用途。

为什么对 3 元组的赋值在os.walk嵌入 for 循环时有效,但在没有 for 循环时则无效?

wja*_*rea 5

os.walk返回3 元组,它会产生多个3 元组。来自文档

对于树中以目录顶部为根的每个目录(包括顶部本身),它会生成一个 3 元组(dirpath, dirnames, filenames)

有关收益的工作原理,请参阅“yield”关键字有什么作用?(您可以忽略 OP 给出的示例代码。)从技术上讲,os.walk返回一个生成 3 元组的生成器。

for循环迭代 3 元组。您可能会对同一步骤中发生的拆包感到困惑。所以要明确的是,

for dirpath, dirnames, filenames in os.walk(top):
Run Code Online (Sandbox Code Playgroud)

实际上等同于

for branch in os.walk(top):
    dirpath, dirnames, filenames = branch
Run Code Online (Sandbox Code Playgroud)

  • 让步是针对迭代器的。它不会返回全长数组,而是仅返回迭代所需的数组,从而节省内存空间。 (2认同)