我正在使用pyvmomi模块从vCenter导出数据。我非常接近获得所需的输出,但我的脚本只迭代一次。为什么呢?
如果我在print(d)
循环中for
更新字典之前,它将打印所有数据。
脚本摘要:
top_dict = {"data": []}
def get_obj(content, vimtype, name=None):
return [item for item in content.viewManager.CreateContainerView(
content.rootFolder, [vimtype], recursive=True).view]
## MAIN ##
...
content = si.RetrieveContent()
d = {}
idnum = 0
for dc in get_obj(content, vim.Datacenter):
for cluster in get_obj(content, vim.ClusterComputeResource):
for h in cluster.host:
host_wwpn1 = ''
for adaptr in h.config.storageDevice.hostBusAdapter:
if hasattr(adaptr, 'portWorldWideName'):
if host_wwpn1 == '':
host_wwpn1 = (hex(adaptr.portWorldWideName)[2:18])
else:
host_wwpn2 = (hex(adaptr.portWorldWideName)[2:18])
d['id'] = idnum
d['datacenter'] = dc.name
d['cluster'] = cluster.name
d['host'] = h.name
d['pwwn_F1'] = host_wwpn1
d['pwwn_F2'] = host_wwpn2
idnum = idnum + 1
top_dict.update({"data": [d]})
当前输出:
{
"data": [
{
"id": 0,
"datacenter": "MY_DATACENTER",
"cluster": "MY_CLUSTER",
"host": "MY_HOSTNAME",
"pwwn_F1": "XXXXXXXXXXXXXXXX",
"pwwn_F2": "XXXXXXXXXXXXXXXX"
}
]
}
答案 0 :(得分:1)
我很确定您的问题出现在您展示的代码的最后一行。该行用新值替换top_dict
的全部内容。我很确定您要将新词典d
添加到top_dict
内的列表中。
相反,我认为你想做top_dict["data"].append(d)
。您还需要将d
的初始化移动到与append
调用相同的级别(因此可能在前两个循环之间,如果您保持最后一行缩进,就像现在一样)。
我不确定最后一行是否缩进了正确的数量(因为我实际上并不知道你的代码应该做什么)。目前,您可以在使用它们之前多次在d
中设置值。您可能希望将最后一行缩进到与d
中的行设置值相同的级别(d
的初始化也应该也在该级别)。