2017-11-21 16 views
0

Ich habe eine YAML-Datei, test.yaml:falsche Ausgabe mit pyyaml ​​

test: 
    server_group_1: 
    type: OS::Nova::ServerGroup 
    properties: 
     name: { get_param: [server_groups, 5] } 
     policies: [ { get_param: [server_group_types, 5] } ] 

und wenn ich PyYAML verwenden zu lesen und die Ausgabe drucken Sie es mir unten Ausgang gibt, die aus dem Eingang unterscheiden

test: 
    server_group_1: 
    properties: 
     name: 
     get_param: 
     - server_groups 
     - 5 
     policies: 
     - get_param: 
     - server_group_types 
     - 5 
    type: OS::Nova::ServerGroup 

Code:

import yaml 
print yaml.dump(yaml.load(open('/test.yaml')), default_flow_style=False) 

möchte ich den Ausgang gleich dem Eingang, auch hier bestellen wird immer chan ged

Antwort

0

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]}] 
+0

Dank Anthon ... Ich habe zwei Dateien fusionieren – Naresh

+0

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

+0

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