I have a some.yaml file with the below contents.
init_config: {} instances: - host: <IP> username: <username> password: <password> The yaml file should be parsed and updated as below.
init_config: {} instances: - host: 1.2.3.4 username: Username password: Password How do I parse the values and update them appropriately?
The ruamel.yaml package was specifically enhanced (by me starting from PyYAML) to do this kind of round-trip, programmatic, updating.
If you start with (please note I removed the extra initial spaces):
init_config: {} instances: - host: <IP> # update with IP username: <username> # update with user name password: <password> # update with password and run:
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' yaml = ruamel.yaml.YAML() yaml.indent(mapping=ind, sequence=ind, offset=bsi) with open('output.yaml', 'w') as fp: yaml.dump(config, fp) The output will be:
init_config: {} instances: - host: 1.2.3.4 # update with IP username: Username # update with user name password: Password # update with password The ordering of mapping keys (host, username and password), the style and the comments are preserved without any further specific action.
Instead of having the indent and block sequence indent guessed, you can do a manual traditional load, and set the indent values yourself:
yaml = ruamel.yaml.YAML() yaml.indent(mapping=6, sequence=4) with open(file_name) as fp: config = yaml.load(fp) If you look at the history of this answer, you can see how to do this with a more limited, PyYAML like, API.
This is how i can read from the above file i mentioned, parse and update as needed.
import yaml fname = "some.yaml" stream = open(fname, 'r') data = yaml.load(stream) data['instances'][0]['host'] = '1.2.3.4' data['instances'][0]['username'] = 'Username' data['instances'][0]['password'] = 'Password' with open(fname, 'w') as yaml_file: yaml_file.write( yaml.dump(data, default_flow_style=False))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With