我正在使用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"
}
]
}
发布于 2018-01-09 00:55:30
我很肯定您的问题是在您展示的代码的最后一行。该行用新值替换top_dict
的整个内容。我很确定您希望将您的新字典d
添加到top_dict
中的列表中。
相反,我认为你想做top_dict["data"].append(d)
。您还需要将d
的初始化移到与append
调用相同的级别(因此,如果您保持当前的最后一行缩进,则可能在前两个循环之间)。
我不确定最后一行是否缩进了正确的数量(因为我实际上不知道您的代码应该做什么)。目前,在使用这些值之前,您可能会在d
中多次设置它们。您可能希望将最后一行缩进到与d
中的行设置值相同的级别( d
的初始化也应该在该级别上)。
https://stackoverflow.com/questions/48104944
复制相似问题