2012-10-22 7 views
8

Ich habe das folgende Problem beim Zuordnen von Dokumenten innerhalb einer YAML-Datei zu einem dict und ordnungsgemäß zuordnen.Konvertieren von YAML-Datei in Python-Dict

Ich habe folgende YAML-Datei, die einen Server darstellt (db.yml):

instanceId: i-aaaaaaaa 
    environment:us-east 
    serverId:someServer 
    awsHostname:ip-someip 
    serverName:somewebsite.com 
    ipAddr:192.168.0.1 
    roles:[webserver,php] 

ich diese YAML-Datei laden, die ich ohne Probleme tun können, ich glaube, das verstehe ich.

instanceId = getInstanceId() 
stream = file('db.yml', 'r') 
dict = yaml.load_all(stream) 

for key in dict: 
    if key in dict == "instanceId": 
     print key, dict[key] 

würde ich die Logik mag wie folgt arbeiten:

  • Last yaml, Karte
  • Blick in jedem dict in dem Dokument dict, wenn die instanceId übereinstimmt, die eingestellt wurde Nach getInstanceId(), dann drucken Sie alle Schlüssel und Werte für das Dokument aus.

Wenn ich auf der Karte Datenstruktur von der Kommandozeile sehen, die ich erhalten:

{'instanceId': 'i-aaaaaaaa environment:us-east serverId:someServer awsHostname:ip-someip serverName:someserver ipAddr:192.168.0.1 roles:[webserver,php]'} 

Ich glaube, ich könnte die Datenstruktur für die YAML-Datei nicht ordnungsgemäß erschaffen, und auf die Inhalte passend auf Die dict, ich bin ein bisschen verloren.

Seitennotiz: Ich kann nicht alle Dokumente in dieser Datei laden mit yaml.load(), versuchte ich yaml.load_all(), die funktionieren scheint, aber mein Hauptproblem besteht immer noch.

+3

Bitte benenne 'dict' in etwas anderes um. Das ist schlecht schlecht.Können Sie auch den Wert von 'yaml.load_all (stream) 'drucken, damit wir sehen können, was Sie tatsächlich haben? Zu guter Letzt scheint es nicht so, als hätten Sie ein gutes YAML-Beispiel hinzugefügt - wo sind mehrere Server definiert? – gahooa

+0

Ich werde es umbenennen, danke für die beste Praxis. yaml_load_all (stream) zeigt: . Ich habe das zweite Dokument zur Fehlerbehebung entfernt. –

+0

Welche Bibliothek/Modul wird im Code verwendet? Ich denke, es würde diese Frage verbessern, um die Import-Anweisung hinzuzufügen, so dass Leute, die diese Frage finden, nicht danach suchen und möglicherweise mehrere mögliche finden müssen. – Zelphir

Antwort

13

Ich denke, Ihre yaml Datei aussehen sollte (wie oder zumindest etwas, so ist es richtig trotzdem strukturiert):

instance: 
    Id: i-aaaaaaaa 
    environment: us-east 
    serverId: someServer 
    awsHostname: ip-someip 
    serverName: somewebsite.com 
    ipAddr: 192.168.0.1 
    roles: [webserver,php] 

, dann yaml.load(...) kehrt:

{'instance': {'environment': 'us-east', 'roles': ['webserver', 'php'], 'awsHostname': 'ip-someip', 'serverName': 'somewebsite.com', 'ipAddr': '192.168.0.1', 'serverId': 'someServer', 'Id': 'i-aaaaaaaa'}} 

Und können Sie gehen aus dort ...


So verwendet wie:

>>> for key, value in yaml.load(open('test.txt'))['instance'].iteritems(): 
    print key, value 


environment us-east 
roles ['webserver', 'php'] 
awsHostname ip-someip 
serverName somewebsite.com 
ipAddr 192.168.0.1 
serverId someServer 
Id i-aaaaaaaa 
+0

Hmm, ich habe das versucht, aber ich bekomme nicht das gleiche Ergebnis mit dem yaml, das du oben benutzt hast: https://gist.github.com/3934903 –

+0

@zippy Woher kommt diese Yaml-Datei? –

+0

Da kein integriertes Modul mit dem Namen "Yaml" und mehr als eine Drittanbieterbibliothek mit diesem Namen vorhanden ist, besteht das Problem möglicherweise darin, dass Sie eine andere Bibliothek als die der Antwort verwenden. Ich habe verifiziert, dass PyYAML 3.10, sowohl pure-Python mit libyaml 0.1.4, gibt die Antwort @ JonClements zeigt, und so Simpleyaml 3.10. Vielleicht hast du eine kaputte Bibliothek (was auch erklären könnte, warum du versucht hast, zerbrochenes Yaml zu analysieren?). – abarnert

2

Ein weiterer Fehler im Code, die nicht mit YAML zu tun hat:

for key in dict: 
    if key in dict == "instanceId": # This doesn't do what you want 
     print key, dict[key] 

in ist ein Operator, der auf den Karten auf sequence types, und auch funktioniert. Dies ist, warum dies kein Syntaxfehler ist ... aber es tut nicht, was Sie wollen.

key in dict wird immer auf True ausgewertet, weil alle Schlüssel, die Sie durchlaufen, im dict sind. Ihr Code läuft also auf True == "instanceId" herunter, was immer zu False ausgewertet wird, weil der boolesche Wert True niemals gleich dieser Zeichenfolge ist.

Sie haben vielleicht bemerkt, dass die print-Anweisung keine Ausgabe erzeugt; Dies ist, weil es nie aufgerufen wird.