Python 保持稳定,;使用ruamel.YAML加载/卸载YAML时的别名

Python 保持稳定,;使用ruamel.YAML加载/卸载YAML时的别名,python,python-2.7,pyyaml,ruamel.yaml,Python,Python 2.7,Pyyaml,Ruamel.yaml,使用yaml.load时,如何避免ruamel.yaml合并锚? 我想保持文件原样,只需修改一些键,如生产->主机&生产->端口,然后转储到文件 defaults: &defaults host: <%= ENV.fetch("VBOX_IP", "127.0.0.1") %> adapter: mysql2 reconnect: true encoding: utf8 username: root production: default:

使用yaml.load时,如何避免
ruamel.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
defaults:&defaults
主持人:
适配器:mysql2
重新连接:正确
编码:utf8
用户名:root
制作:
违约:

如果文件
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

然后,
重新连接
键将添加到以合并键开始的映射中。

感谢您的详细回答。我在我的脚本中发现了一个错误,它设置了任何导致不想要的结果的属性
data['production']['default']['reconnect'] = 'False'