2017-10-04 32 views
1

如何在使用yaml.load时避免合并锚点ruamel.yaml? 我想保持文件是,只需修改一些键,如production -> host & production -> port和转储到文件使用ruamel.yaml在加载/转储YAML上保留锚点和别名

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 

回答

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键将被添加到与合并键启动映射。

+0

感谢您的详细解答。我在脚本中发现了一个错误,它设置了导致不需要的结果的任何属性 –