使用 ruamel.yaml 在 load/dump YAML 上保留锚点和别名

Keep anchors & aliases on load/dump YAML using ruamel.yaml

如何避免ruamel.yaml在使用yaml.load时合并锚点? 我想保持文件原样,只需修改一些键,例如 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

如果文件 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'))将为您提供往返 loader/dumper,同时保留锚点名称和合并密钥 (<<) .

请注意,如果您愿意:

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

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