Пакет ruamel.yaml был специально улучшен (я начал с PyYAML) для этого вид туда и обратно, программный, обновление.
Если вы начнете с (обратите внимание, что я удалил лишние начальные пробелы):
init_config: {}
instances:
- host: <IP> # update with IP
username: <username> # update with user name
password: <password> # update with password
и запустите:
import ruamel.yaml
file_name = 'input.yaml'
config, ind, bsi = ruamel.yaml.util.load_yaml_guess_indent(open(file_name))
instances = config['instances']
instances[0]['host'] = '1.2.3.4'
instances[0]['username'] = 'Username'
instances[0]['password'] = 'Password'
with open('output.yaml', 'w') as fp:
yaml.dump(config, fp)
Вывод будет:
init_config: {}
instances:
- host: 1.2.3.4 # update with IP
username: Username # update with user name
password: Password # update with password
Порядок ключей сопоставления (host
, username
и password
), стиль и комментарии сохраняются без каких-либо дополнительных действий.
Вместо того, чтобы угадывать отступ и отступ последовательности блоков, вы можете выполнить традиционную ручную загрузку и самостоятельно установить значения отступа:
yaml = ruamel.yaml.YAML()
yaml.indent(mapping=6, sequence=4)
with open(file_name) as fp:
config = yaml.load(fp)
Если вы посмотрите на историю этого ответа, вы увидите, как это сделать с помощью более ограниченного API, похожего на PyYAML.
person
Anthon
schedule
13.04.2015