gpt4 book ai didi

python - 为什么在导入 yaml 文件时遍历生成器对象后内容被删除

转载 作者:行者123 更新时间:2023-11-28 18:15:07 24 4
gpt4 key购买 nike

我想了解为什么在使用 PyYAML 将 yaml 文件加载到 Python 中的变量中,然后对创建的生成器对象执行操作(获取内容)...变量变为空。

例子

模板.yml

doc1:
atest:
attr: attr0
btest:
attr: attr1, attr12
ctest:
attr: attr2, attr22
---
doc2:
atest:
attr: attr0
btest:
attr: attr1, attr12
ctest:
attr: attr2, attr22

python

>>> file = open("template.yml", "r")
>>> content = yaml.safe_load_all(file)
>>> content
>>> <generator object load_all at 0x1079f9518>
>>> for doc in content:
... print(doc)
...
{'doc1': {'atest': {'attr': 'attr0'}, 'btest': {'attr': 'attr1, attr12'}, 'ctest': {'attr': 'attr2, attr22'}}}
{'doc2': {'atest': {'attr': 'attr0'}, 'btest': {'attr': 'attr1, attr12'}, 'ctest': {'attr': 'attr2, attr22'}}}
>>> content
<generator object load_all at 0x1079f9518>
>>> for doc in content:
... print(doc)
...
>>>

如您在上次调用中所见,第一次遍历内容变量生成器对象后没有产生任何结果。即使变量仍然作为生成器对象存在,数据也不存在。那为什么会被擦掉呢?

此外,我刚刚开始使用 yaml,我的第一个想法是,“太好了,这将生成一个字典字典”变量,但它是一个文档列表(字典)是有道理的。对我来说没有意义的是,为什么 yaml 文件被解析为不可订阅的 generator 对象 而不是列表,因为这就是它的行为方式。我想我不了解 Python 生成器...它们不就是迭代器吗?

最佳答案

在 Python 中返回生成器对象而不是列表可能有多种原因。其中包括效率和数据可用性。

在读取 YAML 文档流的情况下,将所有文档加载到内存中会降低内存效率,以防您希望一次处理一个文档而文档之间很少或没有数据交换。

它也可以在时间上更有效率,例如对于等待读取流中第一个文档的结果显示在屏幕上的人来说,如果您加载第一个文档,显示结果然后继续加载第二个文档,等等。

但最重要的原因是数据可用性:如果您正在处理一个流,该流仍然可以写入并且可能不完整:额外的数据可能会添加到流中的当前 YAML 文档,或者额外的文档可能会被添加到流中。您的文件只是一个流的(无聊的)边缘案例,其中完整的流是预先可用的。

如果您有一个基于流的 API 并使用生成器,如果您不关心上述效率,您可以通过输入 [] 轻松地将其变成可重复列表。发电机周围。但是反过来(将列表作为生成器呈现)并不能提高内存效率,并且会让您等待任何结果列表,直到流关闭(即,通常您不知道最后的 ... 的信息流中的最后一个文档不会跟随另一个文档)。

在所有数据可用之前的类似处理和呈现由网络浏览器和视频显示程序完成:

  • 浏览器获取您为其提供 URL 的主页并开始显示它,尽管并未加载所有图像。如果您的长页面上有很多图片和/或互联网连接速度较慢,您可以在页面完全加载之前开始阅读。一些图像格式支持在所有数据流入之前显示低分辨率图像。(这在调制解调器连接速度较慢的 90 年代初期比现在更重要)。

  • 如果您正在观看视频,您不希望它加载所有视频,然后加载所有音频和可能的字幕,然后才开始显示流。如果是超高清电影流,它可能不适合您的计算机内存。如果您正在观看实时视频,则所有这些数据甚至都不可用。

这种基于流的获取数据的接口(interface)可能稍微复杂一些,但功能更强大。如果您不需要这种能力(因为您有一个完整的流可用),那么这种复杂性当然会妨碍让事情按您期望的那样工作。

关于python - 为什么在导入 yaml 文件时遍历生成器对象后内容被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48835009/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com