2

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
4

1 回答 1

1

如果您在文件中有该 YAML 示例,config.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键将被添加到以合并键开头的映射中。

于 2017-10-04T17:20:08.227 回答