根据 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是字符串,dirs是files列表。然而,大多数示例都会再次迭代dirs和files:
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 循环时则无效?
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)
| 归档时间: |
|
| 查看次数: |
4495 次 |
| 最近记录: |