【问题标题】:PyYaml.load_all() returns generator rather than a dict?PyYaml.load_all() 返回生成器而不是字典?
【发布时间】:2017-03-15 05:56:02
【问题描述】:

我是第一次使用 Yaml(和 Python!)。我试图从单个 .yaml 文件中加载多个文档,但没有得到我期望的结果。我期待一个包含每个文档的 dicts 的 dict,但我却得到了一个生成器对象......?我应该注意到,当我在之前的测试中对 single 文档 yaml 文件使用 yaml.load()(而不是 load_all())时,我能够很好地获取字典。

我遗漏了哪些明显的事情导致我无法收到多个文档?

测试yaml:

---
Tiles:
 dungeon_floor:
   name: 'Dungeon Floor'
   blocked: False
   block_sight: False
   terrain_type: CONST.E_TERRAIN_TYPES.FLAT_FLOOR
   persistent_effects: 'None'
...
---
NPCs:
 gnoll:
   name: "Gnoll"
   equipment: Sword, Shield

def yaml_loader(filepath):
    """Load a yaml file."""
    with open(filepath, "r") as file_descriptor:
        data = yaml.load_all(file_descriptor)
    return data

以及尝试加载和打印字典的代码:

def yaml_loader(filepath):
    """Load a yaml file."""
    with open(filepath, "r") as file_descriptor:
        data = yaml.load_all(file_descriptor)
    return data

if __name__ == "__main__":
    filepath = CONST.YAML_ECS_CONFIG_PATH
    data = yaml_loader(filepath)
    print(data)

...产生以下终端输出:

<generator object load_all at 0x0000000003A64990>

Process finished with exit code 0

【问题讨论】:

  • 你为什么期待一个 dicts 回来?什么会神奇地成为该字典中每个文档的密钥? PyYAML load()load_all() 如果您不能完全控制(现在和将来)您的输入,则可能会很危险,最好使用 safe_load()safe_load_all()

标签: python dictionary yaml


【解决方案1】:

好吧,看看load_all implementation 就很清楚为什么会发生这种情况:

def load_all(stream, Loader=Loader):
    """
    Parse all YAML documents in a stream
    and produce corresponding Python objects.
    """
    loader = Loader(stream)
    try:
        while loader.check_data():
            yield loader.get_data()
    finally:
        loader.dispose()

它确实是一个生成器。所以你只需要把它转换成一个列表:

 data = list(yaml.load_all(file_descriptor))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 2019-07-20
    • 1970-01-01
    • 2019-08-01
    • 2020-02-15
    相关资源
    最近更新 更多