如何以yaml格式获取单个列表元素

时间:2014-10-08 11:40:41

标签: python json python-2.7 yaml pyyaml

在我的python程序中,我有我的字符串:

test = {"Controller_node1_external_port": {"properties": {"fixed_ips": [{"ip_address": "12.0.0.1"}],"network_id": {"get_param": ["ex_net_map_param",{"get_param": "ex_net_param"}]}},"type": "OS::Neutron::Port"}}

yaml.dump(test)正在给我输出:

Controller_node1_external_port:
  properties:
    fixed_ips:
    - {ip_address: 12.0.0.1}
    network_id:
      get_param:
      - ex_net_map_param
      - {get_param: ex_net_param}
  type: OS::Neutron::Port

但我希望ip_address行为- ip_address: 12.0.0.1(意味着没有花括号)

所需的输出:

Controller_node1_external_port:
  properties:
    fixed_ips:
    - ip_address: 12.0.0.1
    network_id:
      get_param:
      - ex_net_map_param
      - {get_param: ex_net_param}
  type: OS::Neutron::Port

2 个答案:

答案 0 :(得分:0)

尝试:

yaml.dump(test, default_flow_style=False)

答案 1 :(得分:0)

如果您从YAML文件开始,您可以使用ruamel.yaml(免责声明:我是PyYAML升级的作者)并执行:

import ruamel.yaml

yaml_in = """
Controller_node1_external_port:
  properties:
    fixed_ips:
    - ip_address: XXX           # <<< update this
      network_id:
        get_param:
        - ex_net_map_param
        - {get_param: ex_net_param}
  type: OS::Neutron::Port
"""

config = ruamel.yaml.load(yaml_in, ruamel.yaml.RoundTripLoader)
config['Controller_node1_external_port']['properties']['fixed_ips'][0]\
    ['ip_address'] = '12.0.0.1'
print ruamel.yaml.dump(config,
                 Dumper=ruamel.yaml.RoundTripDumper)

并获得输出:

Controller_node1_external_port:
  properties:
    fixed_ips:
    - ip_address: 12.0.0.1      # <<< update this
    network_id:
      get_param:
      - ex_net_map_param
      - {get_param: ex_net_param}
  type: OS::Neutron::Port

保留流样式映射/字典(- {get_param: ex_net_param})以及非流式样式(- ip_address: 12.0.0.1)。 评论也被保留了。