2016-06-06 11 views
0

Ich habe einen Anwendungsfall, wo ich Schlüssel auswählen muss: Wert-Paare aus einer neuen YAML-Datei. Überprüfen Sie, ob dieser Schlüssel in der alten YAML-Datei vorhanden ist und ob er den Wert kopiert und in der neuen YAML-Datei festlegt.
Wenn der Schlüssel nicht in der alten Datei vorhanden ist, fragen Sie den Benutzer.Kopieren von Inhalt von einem YAML zu einem anderen YAML nach dem Vergleich der Schlüssel

Code:

copyfile('all.isv', '/home/ubuntu/tmp/deploy/all') 
with open("/home/ubuntu/ansible-environments/aws/lp/all", 'r') as f1: 
    try: 
     oldvars = yaml.load(f1) 
     with open("/home/ubuntu/tmp/deploy/all", 'rw') as f2: 
       newvars = yaml.load(f2) 
       for key,value in newvars.items(): 
         print key, ":", value 
         if key in f1: 
           value = oldvars.items(value) 
           print key,value 
           f2.write(value) 
         else: 
           value = raw_input("Enter the value ") 

Es funktioniert nicht. Nicht in der Lage zu verstehen, wie Sie den Schlüssel in der alten Datei überprüfen und den Wert für diesen Schlüssel in die neue Datei schreiben.

Neue Datei:

# Enter the release and build you wish to deploy 
release: "4.0" 
build: "4_0_178" 
ems_release: "4.0" 
ems_build: "4_0_982" 
build_type: "gold_master" 

# The name prefix is synonymous with the stack (i.e. pdx02-cloud-prod) 
name_prefix: syd01-devops-test 

# The deployment type is one of: [ test | trial | dev | prod ] 
deployment_type: test 
# deployment_url is typically the same value as deployment type unless it is a premium deployment. 
# In that case deployment_type is set to prod and deployment_url is either dev, trial or test 
deployment_url: "{{ deployment_type }}" 
some_new_var: hello 

Alte Datei:

# Enter the release and build you wish to deploy 
release: "4.0" 
build: "4_0_178" 
ems_release: "4.0" 
ems_build: "4_0_999" 
build_type: test_build 

# The name prefix is synonymous with the stack (i.e. pdx02-cloud-prod) 
name_prefix: syd01-devops-deepali 

# The deployment type is one of: [ test | trial | dev | prod ] 
deployment_type: trial 
# deployment_url is typically the same value as deployment type unless it is a premium deployment. 
# In that case deployment_type is set to prod and deployment_url is either dev, trial or test 
deployment_url: "{{ deployment_type }}" 

Erwartet: Datei erzeugt zwei Dateien mit (alten und neuen)

# Enter the release and build you wish to deploy 
    release: "4.0" 
    build: "4_0_178" 
    ems_release: "4.0" 
    ems_build: "4_0_999" 
    build_type: test_build 

    # The name prefix is synonymous with the stack (i.e. pdx02-cloud-prod) 
    name_prefix: syd01-devops-deepali 

    # The deployment type is one of: [ test | trial | dev | prod ] 
    deployment_type: trial 
    # deployment_url is typically the same value as deployment type unless it is a premium deployment. 
    # In that case deployment_type is set to prod and deployment_url is either dev, trial or test 
    deployment_url: "{{ deployment_type }}" 
    some_new_var: Value provided by user as input 

Antwort

1

, dass ungültige Python ist, Ihre try hat keine passende except. Außerdem ist es nicht notwendig, die zweite Datei im Kontext der with-Anweisung zu öffnen, die Sie zum Lesen in der "alten" Datei verwenden. Deshalb beginnt mit:

import ruamel.yaml 

copyfile('all.isv', '/home/ubuntu/tmp/deploy/all') 
with open("/home/ubuntu/ansible-environments/aws/lp/all", 'r') as f1: 
    oldvars = ruamel.yaml.round_trip_load(f1) 

Sie keine YAML-Datei zum Lesen und Schreiben öffnen können, damit es gerade gelesen (und Öffnung zum Lesen und Schreiben einer Datei erfolgt mit ‚r +‘ nicht mit ‚rw‘):

with open("/home/ubuntu/tmp/deploy/all", 'r') as f2: 
    newvars = ruamel.yaml.round_trip_load(f2) 

Danach nicht vertieften und Aktualisierung newvars von oldvars weiterhin falls:

for key in newvars: 
    if key in oldvars: 
     # this copies the value from the old file if the key exists in there 
     value = oldvars[key] 
    else: 
     # ask the user for a new value 
     value = raw_input("Enter the value ") 
    # update the value in newvars 
    newvars[key] = value 
# and write the update mapping back 
with open("/home/ubuntu/tmp/deploy/all", 'w') as f2: 
    ruamel.yaml.round_trip_dump(newvars, f2) 

die Kombination, dass und Benennen Sie Ihre Dateien old.yaml und new.yaml und beantworten Sie die Abfrage mit 'abcd':

import sys 
import ruamel.yaml 

with open('new.yaml') as fp: 
    newvars = ruamel.yaml.round_trip_load(fp) 
with open('old.yaml') as fp: 
    oldvars = ruamel.yaml.round_trip_load(fp) 
for key in newvars: 
    if key in oldvars: 
     # this copies the value from the old file if the key exists in there 
     value = oldvars[key] 
    else: 
     # ask the user for a new value 
     value = raw_input("Enter the value ") 
    # update the value in newvars 
    newvars[key] = value 
ruamel.yaml.round_trip_dump(newvars, sys.stdout) 

gibt Ihnen:

Enter the value abcd 
# Enter the release and build you wish to deploy 
release: '4.0' 
build: '4_0_178' 
ems_release: '4.0' 
ems_build: '4_0_999' 
build_type: test_build 
# The name prefix is synonymous with the stack (i.e. pdx02-cloud-prod) 
name_prefix: syd01-devops-deepali 

# The deployment type is one of: [ test | trial | dev | prod ] 
deployment_type: trial 
# deployment_url is typically the same value as deployment type unless it is a premium deployment. 
# In that case deployment_type is set to prod and deployment_url is either dev, trial or test 
deployment_url: '{{ deployment_type }}' 
some_new_var: abcd 

Bitte beachten Sie, dass:

  • dies nur läuft auf Python 2.7
  • für Skalare, die nicht tun brauchen sie Zitate sind
  • fallen gelassen Ich habe nicht versucht, die vier Raum zu enthalten Einrückung Ihrer Ausgabe nach der ersten Zeile.
+0

Es werden nur die Schlüsselwerte ausgegeben, aber die Formatierung, Reihenfolge und Kommentare aus der Datei werden entfernt. Es wirft nur die neuen vars ab. Also wie schreibe ich einfach die neuen Werte für den Schlüssel und behalte die Formatierung/.content. –

+0

@DeepaliMittal Ihre Spezifikation sagt nichts über Schlüssel aus, die sich in der alten Datei befinden, aber nicht in der neuen. Was willst du mit ihnen machen? Vielleicht können Sie Ihre Frage mit zwei Beispiel-Eingabedateien und der erwarteten Ausgabe aktualisieren. Ich aktualisierte auch die Frage, also behält es die Bestellung bei/behält Anmerkungen – Anthon

+0

Dank. Aber dieser Code behält auch das Format nicht bei. Die Ausgabe, die ich mit diesem Code erhalte, ist etwa so: ordereddict ([('release', '4.0'), ('build', '4_0_178'), ('ems_release', '4.0 '), (' ems_build ',' 4_0_982 '), (' build_type ',' gold_master '), (' name_prefix ',' syd01-devops-deepali ')]) "Auch ich habe mit Dateien aktualisiert. Was ich will ist die Datei sollte gleich bleiben, aber die Werte für verschiedene Schlüssel sollte durch Bezugnahme auf alte Datei oder Benutzer geändert werden –

Verwandte Themen