2017-08-02 6 views
0

Ich versuche, eine YAML-Datei zu lesen und drucken Sie die Liste, die ich dort habe in der Reihenfolge, was es in der Datei ist.Iterieren durch YAML-Liste in Python

So YAML:

b: ... 
a: ... 

Und meine Python ist:

for key, value in yaml.load(open(input_file)).items(): 
    print(str(key)) 

Der Ausgang wird:

a 
b 

Allerdings muss ich es b dann a sein. Ich habe auch versucht iteritems(), und ich bekomme das gleiche Ergebnis.

+0

Warum druckst du (str (key)) ', ergibt das ein anderes Ergebnis als' print (key) '? – Anthon

+0

Wenn Ihr YAML tatsächlich ein Leerzeichen vor dem 'a' und nicht vor dem' b' hat, ist es ungültig YAML. Aber da in Ihrer Ausgabe der Raum magisch vor dem 'b' erschien, nehme ich an, dass das ein Formatierungsfehler war. – Anthon

Antwort

0

Wenn Ihr YAML-Datei enthält:

b: 2 
a: 1 

dann wie folgt Parsen:

from ruamel.yaml import YAML 

yaml = YAML() 
input_file = 'input.yaml' 

for key, value in yaml.load(open(input_file)).items(): 
    print(str(key)) 

wird b zuerst drucken. Wenn Sie jedoch die (schneller) verwenden:

yaml = YAML(typ='safe') 

dies nicht gewährleistet, da die Reihenfolge der Zuordnungsschlüssel nicht durch garantiert durch die YAML-Spezifikation.

Wenn Sie YAML 1.1 und PyYAML verwenden, gibt es keine solche Garantie für die Bestellung, aber Sie sollten nicht yaml.load() in erster Linie verwenden, weil es unsicher ist.

+0

Danke, das macht Sinn. Ich werde YAML im Allgemeinen genauer untersuchen müssen, um das herauszufinden, aber danke, dass du mich in die richtige Richtung gelenkt hast :) – Rikg09

0

yaml.load gibt in diesem Fall nur eine dict zurück, die standardmäßig nicht geordnet ist. Wenn Sie die Reihenfolge beibehalten möchten, müssen Sie eine OrderedDict verwenden, siehe here für ein Beispiel, wie Sie das tun können.