【发布时间】:2021-03-21 14:06:07
【问题描述】:
我正在研究 os.walk() 方法。
我能找到的所有示例都将用法显示为:
for root, dirs, files in os.walk(trackeddir):
for name in files:
print(os.path.join(root, name))
for name in dirs:
print(os.path.join(root, name))
...
但是,当我尝试:root, dirs, files = os.walk(trackeddir) 时,我得到一个异常:“要解压的值太多(预期为 3)”
我尝试将 os.walk() 的输出放入一个变量中,并在调试期间查看该变量中存储的内容,但我无法看到任何“根”、“文件”或“目录” 我希望看到一个元组,但相反,我看到了一个“生成器”的实例
我是一个相对“不错”的 Java 开发人员,这种在运行时处理数据的新风格确实令人困惑。非常感谢任何帮助我解决它的问题!
【问题讨论】:
-
您不会期望
for x in thing和x = thing对x执行相同的分配,对吗?同样在这里。你可以做for root, dirs, files in os.walk(whatever)的事实并不意味着root, dirs, files = os.walk(whatever)有任何意义。 -
您可能需要阅读有关 Python generators 的文档。
-
请澄清您的要求。您是否想知道如何在 for 循环中使用生成器,或者每次迭代如何解包到多个变量?
-
用 Java 术语思考,
os.walk返回Iterator<DirectoryEntry>,其中DirectoryEntry指定路径、目录列表和文件列表(因为 Java 没有开箱即用的元组)。您不能直接将迭代器分配给变量并期望获得下一个条目。您要么需要调用next,要么需要使用for (DirectoryEntry d: treewalker)。在 Python 中类似:使用next获取一个值,或使用for迭代整个可迭代对象。
标签: python python-3.x data-structures file-handling