使用ruamel在yaml中插入节点

时间:2017-10-13 20:26:09

标签: python pyyaml ruamel.yaml

我想打印以下布局:

extra: identifiers: biotools: - http://bio.tools/abyss

我正在使用此代码添加节点:

yaml_file_content['extra']['identifiers'] = {}
yaml_file_content['extra']['identifiers']['biotools'] = ['- http://bio.tools/abyss']

但是,相反,我得到了这个输出,它将工具封装在[]:

extra: identifiers: biotools: ['- http://bio.tools/abyss']

我尝试了其他组合但没有用?

2 个答案:

答案 0 :(得分:1)

加载YAML文件后,它不再是“yaml”;它现在是一个Python数据结构,biotools键的内容是list

>>> import ruamel.yaml as yaml
>>> data = yaml.load(open('data.yml'))
>>> data['extra']['identifiers']['biotools']
['http://bio.tools/abyss']

与任何其他Python列表一样,您可以append向它发送:

>>> data['extra']['identifiers']['biotools'].append('http://bio.tools/anothertool')
>>> data['extra']['identifiers']['biotools']
['http://bio.tools/abyss', 'http://bio.tools/anothertool']

如果您打印出数据结构,则会获得有效的YAML:

>>> print( yaml.dump(data))
extra:
  identifiers:
    biotools: [http://bio.tools/abyss, http://bio.tools/anothertool]

当然,如果由于某种原因你不喜欢那个列表表示,你也可以得到语法上的等价物:

>>> print( yaml.dump(data, default_flow_style=False))
extra:
  identifiers:
    biotools:
    - http://bio.tools/abyss
    - http://bio.tools/anothertool

答案 1 :(得分:1)

- http://bio.tools/abyss中的破折号表示序列元素,如果以块样式转储Python列表,则会在输出中添加。

所以不要这样做:

yaml_file_content['extra']['identifiers']['biotools'] = ['- http://bio.tools/abyss']
你应该这样做:

yaml_file_content['extra']['identifiers']['biotools'] = ['http://bio.tools/abyss']

然后使用:

强制所有复合元素的输出为块样式
yaml.default_flow_style = False

如果您想要更精细的控制,请创建一个ruamel.yaml.comments.CommentedSeq实例:

tmp = ruamel.yaml.comments.CommentedSeq(['http://bio.tools/abyss'])
tmp.fa.set_block_style()
yaml_file_content['extra']['identifiers']['biotools'] = tmp