For Loop Only Iterating Once

时间:2018-01-04 23:13:34

标签: python json python-3.x

我正在使用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"
        }
    ]
}

1 个答案:

答案 0 :(得分:1)

我很确定您的问题出现在您展示的代码的最后一行。该行用新值替换top_dict的全部内容。我很确定您要将新词典d添加到top_dict内的列表中。

相反,我认为你想做top_dict["data"].append(d)。您还需要将d的初始化移动到与append调用相同的级别(因此可能在前两个循环之间,如果您保持最后一行缩进,就像现在一样)。

我不确定最后一行是否缩进了正确的数量(因为我实际上并不知道你的代码应该做什么)。目前,您可以在使用它们之前多次在d中设置值。您可能希望将最后一行缩进到与d中的行设置值相同的级别(d的初始化也应该也在该级别)。