保持锚和&使用ruamel.yaml加载/转储YAML的别名

时间:2017-10-04 10:48:12

标签: python python-2.7 pyyaml ruamel.yaml

使用yaml.load时如何避免ruamel.yaml合并锚点? 我想按原样保存文件,只需修改一些键,例如production -> host& production -> port并转储到文件

defaults: &defaults
  host: <%= ENV.fetch("VBOX_IP", "127.0.0.1") %>
  adapter: mysql2
  reconnect: true
  encoding: utf8
  username: root

production:
  default:
    <<: *defaults
    host: dbname.domain.com
    port: 3306

1 个答案:

答案 0 :(得分:0)

如果您在文件config.yaml中有该YAML示例,则可以执行以下操作:

import sys
import ruamel.yaml


yaml = ruamel.yaml.YAML()

with open('config.yaml') as ifp:
    data = yaml.load(ifp)
data['defaults']['reconnect'] = False
data['production']['default']['port'] += 1

with open('config.yaml', 'w') as ofp:
    yaml.dump(data, ofp)

获取更新文件:

defaults: &defaults
  host: <%= ENV.fetch("VBOX_IP", "127.0.0.1") %>
  adapter: mysql2
  reconnect: false
  encoding: utf8
  username: root

production:
  default:
    <<: *defaults
    host: dbname.domain.com
    port: 3307

默认YAML()(相当于YAML(typ='rt'))将为您提供保留锚名称和合并密钥(<<)的往返加载程序/转储程序。

请注意,如果您这样做:

data['production']['default']['reconnect'] = 'False'

然后reconnect键将添加到以合并键开头的映射中。