2017-10-04 211 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

感謝您的詳細解答。我在腳本中發現了一個錯誤,它設置了導致不需要的結果的任何屬性 –