【问题标题】:Python: How does <class 'generator'> convert to a tuple in my code?Python:<class 'generator'> 如何在我的代码中转换为元组?
【发布时间】: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 thingx = thingx 执行相同的分配,对吗?同样在这里。你可以做for root, dirs, files in os.walk(whatever) 的事实并不意味着root, dirs, files = os.walk(whatever) 有任何意义。
  • 您可能需要阅读有关 Python generators 的文档。
  • 请澄清您的要求。您是否想知道如何在 for 循环中使用生成器,或者每次迭代如何解包到多个变量?
  • 用 Java 术语思考,os.walk 返回Iterator&lt;DirectoryEntry&gt;,其中DirectoryEntry 指定路径、目录列表和文件列表(因为 Java 没有开箱即用的元组)。您不能直接将迭代器分配给变量并期望获得下一个条目。您要么需要调用next,要么需要使用for (DirectoryEntry d: treewalker)。在 Python 中类似:使用 next 获取一个值,或使用 for 迭代整个可迭代对象。
  • 这能回答你的问题吗? How does a Python for loop with iterable work?

标签: python python-3.x data-structures file-handling


【解决方案1】:

这是因为os.walk 是一个生成器。当你迭代一个生成器时,它将产生下一个元素,直到没有剩下的元素。请注意,您可以在变量中定义生成器,然后无需循环即可获取下一组元素:

g = os.walk(tracckeddir)
r, d, f = next(g)

要返回将生成的整个元素集,您可以申请list()

list(os.walk(trackeddir))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-15
    • 2018-12-12
    • 1970-01-01
    • 2022-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    相关资源
    最近更新 更多