【问题标题】:Keep anchors & aliases on load/dump YAML using ruamel.yaml使用 ruamel.yaml 在加载/转储 YAML 时保留锚点和别名
【发布时间】:2017-10-04 10:48:11
【问题描述】:

如何避免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

【问题讨论】:

    标签: python python-2.7 pyyaml ruamel.yaml


    【解决方案1】:

    如果您在文件 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'))将为您提供往返加载程序/转储程序,它保留了锚名称和合并密钥(&lt;&lt;)。

    请注意,如果您愿意:

    data['production']['default']['reconnect'] = 'False'
    

    然后reconnect 键将被添加到以合并键开头的映射中。

    【讨论】:

    • 感谢您的详细解答。我在我的脚本中发现了一个错误,它设置了任何导致不需要的结果的属性
    猜你喜欢
    • 2018-07-11
    • 2020-05-30
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 2020-10-22
    • 2019-03-27
    • 2017-10-01
    • 1970-01-01
    相关资源
    最近更新 更多