Как получить один элемент списка в формате yaml
В моей программе на 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 ответа
Решение
Если вы начинаете с файла 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
) те. Комментарий также сохранился.