Il pacchetto ruamel.yaml è stato appositamente migliorato (da me a partire da PyYAML)) per eseguire questo tipo di aggiornamento programmatico, programmatico.
Se si inizia con (si prega di notare ho rimosso gli spazi iniziali in più):
init_config: {}
instances:
- host: <IP> # update with IP
username: <username> # update with user name
password: <password> # update with password
e si esegue:
import ruamel.yaml
file_name = 'input.yml'
from ruamel.yaml.util import load_yaml_guess_indent
config, ind, bsi = 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'
ruamel.yaml.round_trip_dump(config, open('output.yml', 'w'),
indent=ind, block_seq_indent=bsi)
L'output sarà:
init_config: {}
instances:
- host: 1.2.3.4 # update with IP
username: Username # update with user name
password: Password # update with password
L'ordinamento di chiavi di mappatura (host
, username
e password
), lo stile e i commenti vengono conservati senza ulteriori azioni specifiche.
Invece di avere il trattino e la sequenza di blocchi trattino indovinato, si può fare un carico più tradizionali, e impostare il rientro dei valori da soli:
config = ruamel.yaml.load(open(file_name), ruamel.yaml.RoundTripLoader)
ind = 6
bsi = 4
Se si utilizza [PyYaml] (http://pyyaml.org/wiki/PyYAMLDocumentation), è possibile utilizzare Loader per caricare d ata e Dumper per scrivere dati su file. I dati caricati sono un normale dizionario in Python, quindi puoi accedere all'elemento per chiave e quindi cambiarlo come desideri. –
Non è chiaro se si desidera un motore di template (e si sta indirizzando male a risposte utili essendo troppo stretti) o semplicemente si vuole analizzare un YAML e sostituire alcuni valori di stringa nei dati analizzati. Sii più specifico e spiega cosa vuoi ottenere e perché. – MariusSiuram
È un file. Ho bisogno di analizzare un file yaml e sostituire i contenuti. – Chetan