使用ruamel.yaml在加载/转储YAML上保留锚点和别名
问题描述:
如何在使用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
答
如果有文件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
键将被添加到与合并键启动映射。
感谢您的详细解答。我在脚本中发现了一个错误,它设置了导致不需要的结果的任何属性 –