Ihr kurzer PyYAML-Code hat mehrere Probleme, die sich nicht auf die Reihenfolge der Schlüssel in Zuordnungen beziehen (die PyYAML immer sortiert).
Es ist fast nie notwendig, PyYAMLs load()
ohne Loader
Parameter zu verwenden, der als unsicher dokumentiert ist. Und Sie können keinen Stream-Parameter an dump()
liefern, der dazu führt, dass die Ausgabe in den Speicher geschrieben, abgerufen und dann Sie print
es. Sie sollten einfach dump(yaml.safe_load(open('/test.yaml')), sys.stdout, default_flow_style=False)
verwenden, wenn Sie mit PyYAML experimentieren möchten.
Obwohl es möglich ist PyYAML Mapping zu haben geladen, wie Python Wörter bestellt haben, ist dies nicht trivial.
Weitaus problematischer ist der verschachtelte Fließstil, z. {get_param: [server_groups, 5]}
, in dem eine Flow-Style-Liste in einem Flow-Style-Mapping verschachtelt ist. Das PyYAML-Steuerelement für den Flow-Stil ist einer von dreien: überhaupt kein Flow-Style oder alles Flow-Style oder alle Flow-Style-Stile.
Sie sollten bei ruamel.yaml
aussehen (Disclaimer: Ich bin der Autor des Pakets), in dem Sie tun können:
import sys
import ruamel.yaml
yaml = ruamel.yaml.YAML()
with open('test.yaml') as fp:
data = yaml.load(fp)
yaml.dump(data, sys.stdout)
dies bewahrt den Schlüssel um, und der Ablauf Stil wird auf allen Ebenen erhalten. Das einzige, was Sie nicht steuern können, sind die zusätzlichen Leerzeichen nach/vor den geschweiften Klammern des Fließstils und die inkonsistenten zusätzlichen Leerzeichen nach/vor den eckigen Klammern des Fließstils.
Mit dem obigen Code erhalten Sie:
test:
server_group_1:
type: OS::Nova::ServerGroup
properties:
name: {get_param: [server_groups, 5]}
policies: [{get_param: [server_group_types, 5]}]
Dank Anthon ... Ich habe zwei Dateien fusionieren – Naresh
nun zwei Dateien zusammenführen, ohne Ich bin mit ruamel.yaml versucht die Lage, die Reihenfolge zu ändern ... Vielen Dank für die Hilfe und haben Sie Rhel rpm für ramel.yaml .... – Naresh
Ich habe keine RPM zur Verfügung, und ich bin mir nicht bewusst, eine Distribution, die hat. Sie sollten virtualenv (installiert über RPM oder direkt) verwenden und Ihre eigenen Anwendungen mit virtualenv erstellen, dann ist es leicht zu deinstallieren, indem Sie das Anwendungsverzeichnis entfernen. – Anthon