2017-09-11 1 views
-1

Ich habe Yaml-Datei, sieht so aus.Wie zu lesen Dynamische Aktualisierung von YAML mit Python

--- 
env: 
    credentials: 
    endpoint: "value" 
    username: "value" 
    tenant: "value" 
    password: "value" 

    ld_a: 
    network: 
     subnet-name: 
      - sub1 
     ld_filename: 
      - ld1.xml 
     fd_filename: 
      - fd1.xml 
      - fd2.xml 

    ld_b: 
    network: 
     subnet-name: 
      - sub2 
     ld_filename: 
      - ld2.xml 
     fd_filename: 
      - fd1.xml 
      - fd2.xml 

Zu jedem Zeitpunkt Benutzer kann die YAML mit ld_c oder nachfolgenden Tags aktualisieren oder zu Tag entfernen.

Ab jetzt überprüfe ich für ld_a in dict und Handhabung verschachtelten Schlüssel, Werte (wie unten).

with open(r'C:\file.yaml', 'r') as fd: 
    data = yaml.load(fd) 

items = data.get('env') 
for descriptor, value in items.iteritems(): 
    if descriptor == 'credentials': 
     tenant = value.get('tenant') 
     username = value.get('username') 
     password = value.get('password') 
     endpoint = value.get('endpoint') 


    if descriptor == 'ld_a': 
     for descriptor in value.viewvalues(): 
      for user_networks in descriptor.get('subnet-name'): 
       get_network_details(neutron, user_networks) 

Aber wenn der Benutzer das Hinzufügen würde/Entfernen-Tasten zB ld_c. Wie sollen wir das in Python handhaben?

+1

Es klingt, als würden Sie sagen, dass ein Benutzer Schlüssel hinzufügen/entfernen würde, indem er den Inhalt von file.yaml in dem Dateisystem ändert, in dem das Programm läuft. Wenn es einen Grund gibt, warum der Benutzer das Programm nicht jedes Mal erneut ausführen kann, wenn er die Datei ändert, dann müssen Sie vielleicht Ihre Annahmen/Anforderungen klären. – Peter

+1

Ich verstehe es nicht. Sie könnten die Datei in Intervallen neu laden und nach neuen 'Schlüsseln' suchen (zB' ld_c') und sehen, ob es Dinge gibt, mit denen Operationen ausgeführt werden können. Ich meine, Sie müssen einfach mehr und mehr 'if' Anweisungen zu Ihrem Code hinzufügen! – TechJS

+0

Und eine andere Sache, was meinst du mit 'nachfolgenden Tags'? Du meinst 'ld_c',' ld_d', 'ld_e' und so weiter? – TechJS

Antwort

4

Mit meinem Grundwissen ist hier Ihre Antwort:

import re 

pattern = re.compile(r"ld_[a-z]") 

if pattern.match(descriptor): 
    for descriptor in value.viewvalues(): 
     for user_networks in descriptor.get('subnet-name'): 
      get_network_details(neutron, user_networks) 

Grundsätzlich Sie reguläre Ausdrücke auf descriptor durchführen und sie paßt zu jedem ld_ Zeichen für Zeichen gefolgt, die ein bis Z (a, b, c. ..)

+0

das funktioniert wie ein Charme.! Vielen Dank! – tgcloud