gpt4 book ai didi

python - 使用Python输出YAML : incorrect formatting without lists in input

转载 作者:行者123 更新时间:2023-12-01 08:22:18 37 4
gpt4 key购买 nike

我正在尝试从 Python 字典创建 YAML。到目前为止,我已经尝试了 PyYAML 和 ruamel.yaml,两者都有相同的结果:如果输入字典不包含列表,则输出格式不正确。

这是脚本:

from ruamel import yaml
import sys

yaml.dump({'name': 'Enterprise', 'class': 'Galaxy', 'armament': ['photon torpedoes','phasers'], 'number': 1701}, sys.stdout)
print('\n')
yaml.dump({'name': 'Enterprise', 'class': 'Galaxy', 'number': 1701}, sys.stdout)

这是输出:

armament: [photon torpedoes, phasers]
class: Galaxy
name: Enterprise
number: 1701

{class: Galaxy, name: Enterprise, number: 1701}

所需的输出是第二个 YAML 转储的格式应与第一个相同。这是怎么回事?

最佳答案

您正在使用旧式 API,默认输出任何叶子流式节点。在您的情况下,列表/序列[光子鱼雷,移相器]和您的秒转储(其中根级别叶节点)。

<小时/>

假设您不仅想要解释为什么会发生这种情况,还想要了解如何使用新 API、使用 ruamel.yaml.YAML 实例来更改此行为,默认值为使所有内容都流式化,包括所有叶节点:

from ruamel.yaml import YAML
import sys

yaml = YAML()

yaml.dump({'name': 'Enterprise', 'class': 'Galaxy', 'armament': ['photon torpedoes','phasers'], 'number': 1701}, sys.stdout)
print()
yaml.dump({'name': 'Enterprise', 'class': 'Galaxy', 'number': 1701}, sys.stdout)

给予:

name: Enterprise
class: Galaxy
armament:
- photon torpedoes
- phasers
number: 1701

name: Enterprise
class: Galaxy
number: 1701

仍然不是你想要的:-)

您现在有两个选项来获取您所指示的内容:第一个转储上的叶节点流样式和第二个转储上的叶节点 block 样式。

第一个是让一个 default_flow_style 设置用于第一次转储,并且第二个转储的“正常”转储:

from ruamel.yaml import YAML
import sys

yaml = YAML()

yaml.default_flow_style = None
yaml.dump({'name': 'Enterprise', 'class': 'Galaxy', 'armament': ['photon torpedoes','phasers'], 'number': 1701}, sys.stdout)
print()
yaml = YAML()
yaml.dump({'name': 'Enterprise', 'class': 'Galaxy', 'number': 1701}, sys.stdout)

给出:

name: Enterprise
class: Galaxy
armament: [photon torpedoes, phasers]
number: 1701

name: Enterprise
class: Galaxy
number: 1701

第二个选项是显式设置对象的流程样式您想要作为序列输出。因此你必须创建一个ruamel.yaml.comments.CommentedSeq 实例,通常使用加载时保留流/ block 样式、注释等:

from ruamel.yaml import YAML, comments
import sys

yaml = YAML()

armaments = comments.CommentedSeq(['photon torpedoes','phasers'])
armaments.fa.set_flow_style()
yaml.dump({'name': 'Enterprise', 'class': 'Galaxy', 'armament': armaments, 'number': 1701}, sys.stdout)
print()
yaml.dump({'name': 'Enterprise', 'class': 'Galaxy', 'number': 1701}, sys.stdout)

这也给出了:

name: Enterprise
class: Galaxy
armament: [photon torpedoes, phasers]
number: 1701

name: Enterprise
class: Galaxy
number: 1701

第二个选项当然可以为您提供精细的控制(还有一个 CommentedMap)可以在数据层次结构的所有级别上拥有这些对象,而不仅仅是在集合的叶子上。

<小时/>

请注意,从具有您想要的格式的 YAML 文件加载所需的输出时,您不必经历任何这些滑稽的事情。在这种情况下,字典分别对应。类似列表的实例是使用正确的流/ block 样式创建的,因此当仅更改/添加值并转储回来时,输出不会意外更改。

关于python - 使用Python输出YAML : incorrect formatting without lists in input,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54545778/

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