Как отсортировать файл yaml и указать значения для каждого дерева - PullRequest
0 голосов
/ 13 июня 2019

Я работаю над сценарием для чтения конфигурации YAML, и у меня возникли некоторые проблемы с логикой циклов for и словаря.Я могу заставить его печатать каждое значение, когда сделано статично, но это отбрасывает цель моего скрипта.Поскольку я хотел бы динамически вызывать функции с помощью файла конфигурации YAML.

До сих пор я мог получить только первый ключ и значение из моего скрипта for.Каждый раз, когда я пытаюсь пойти дальше, используя dataMap [ключ] [0] [значение], я не могу пойти дальше, чем 1.

import yaml

with open('design.yaml') as f:
    dataMap = yaml.safe_load(f)
print("================================")
print("Topo #1")
print("================================")
print(f"Topo Name: {dataMap['topology'][0]['name']}")
print(f"vPort: {dataMap['topology'][0]['vport']}")
print(f"DG Name: {dataMap['topology'][1]['devicegroup']}")
print(f"Multiplier: {dataMap['topology'][1]['multiplier']}")
print(f"Eth Name: {dataMap['topology'][1]['eth']['name']}")
print("Auto Output - To look just like above")
print("================================")
for key, value in dataMap.items():
    #Updated
    print("KEY: {} - VALUE: {}".format(key, value[0].items()))
    print("====")
print("================================")
#print("Recursive Function Test")
#print("================================")
#myprint(dataMap)
config:
 -name: Test
topology:
 - name: DC1
   vport: Port1
 - devicegroup: DC1 DG1
   multiplier: 50
   eth:
     name: ETH1
     macStart: 00:01:01:01:00:01
     macStep: 00:00:00:00:00:01
     enableVLAN: True
     vlanID: 100
     vlanStep: 0
   ipv4:
     name: DC1 DG1 IPv4
     startIP: 10.1.1.10
     stepIP: 0.0.0.1
     netmask: 255.255.255.0
     gateway: 10.1.1.1
     gwStep: 0.0.0.0
 - name: TEST2
   vport: Port2
 - devicegroup: TEST DG2
Output:
KEY: config - VALUE: dict_items([('apiServer', '10.255.251.105'), ('apiServerPort', 443), ('osPlatform', 'linux'), ('username', 'admin'), ('password', 'admin'), ('chassisIP', '10.253.0.82'), ('licenseserver', '10.253.0.82'), ('licensemode', 'subscription'), ('licensetier', 'tier3'), ('POCName', 'XXXXX'), ('POCNumber', 'XXXXX')])
====
KEY: topology - VALUE: dict_items([('name', 'DC1'), ('vport', 'Port1')])

Моя проблема в том, как мне вытащитьинформация группы устройств из файла YAML?Изменение значения [0] на значение [1] вызывает проблему с индексом.

print("KEY: {} - VALUE: {}".format(key, value[1].items()))
IndexError: list index out of range

Итак, как мне перейти к файлу YAML с этим?

1 Ответ

1 голос
/ 13 июня 2019

Я не уверен на 100%, но я не думаю, что вызов функции внутри f-строки оценивается, поэтому попробуйте и выполните:

    print("KEY: {} - VALUE: {}".format(key, value[0].items()))

.

Дополнительнозначение для конфигурации key представляет собой последовательность (то есть загруженную в виде списка Python), которая имеет только один элемент, поэтому вы не можете индексировать дальше в этой последовательности, тогда 0.

Вам лучше попробовать и сделать что-то вроде:

for key, values in dataMap.items():
    for idx, value in enumerate(values):
        print("KEY: {} - VALUE[{}]: {}".format(key, idx, value.items()))
        print("====")
...