如何对 yaml 文件进行排序并为每棵树提供值
How to sort through a yaml file and provide values for each tree
我正在编写一个脚本来读取 YAML 配置,但在 for 循环和字典的逻辑上遇到了一些问题。我可以让它在静态完成时打印每个值,但这偏离了我的脚本的目的。因为我想使用 YAML 配置文件动态调用函数。
到目前为止,我只能从 for 脚本中获取第一个键和值。任何时候我尝试通过使用 dataMap[key][0][value] 走得更远时,我都无法走得更远 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 文件中提取设备组信息?将 value[0] 更改为 value[1] 会导致索引问题。
print("KEY: {} - VALUE: {}".format(key, value[1].items()))
IndexError: list index out of range
那么我该如何进一步进入 YAML 文件呢?
我不是 100% 确定,但我不认为 f-string 中的函数调用被评估,所以尝试做:
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("====")
我正在编写一个脚本来读取 YAML 配置,但在 for 循环和字典的逻辑上遇到了一些问题。我可以让它在静态完成时打印每个值,但这偏离了我的脚本的目的。因为我想使用 YAML 配置文件动态调用函数。
到目前为止,我只能从 for 脚本中获取第一个键和值。任何时候我尝试通过使用 dataMap[key][0][value] 走得更远时,我都无法走得更远 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 文件中提取设备组信息?将 value[0] 更改为 value[1] 会导致索引问题。
print("KEY: {} - VALUE: {}".format(key, value[1].items()))
IndexError: list index out of range
那么我该如何进一步进入 YAML 文件呢?
我不是 100% 确定,但我不认为 f-string 中的函数调用被评估,所以尝试做:
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("====")