我对我希望我的Python字典列表看起来像有什么想法,但在将电子表格数据拉入数据结构时遇到问题。我遇到的问题是,一行可能有数据来填充父字典值以及一个孩子。对于后续行,如果父级列的值为空,则假定子级的列属于上一级父级。如果我们遇到父数据不为空的新行,请将其视为要添加到列表中的新父项。使用电子表格数据填充嵌套字典
这是电子表格会是什么样子的例子:
+--------------+-------------------+---------+----------+--------------------+--------------+------------------+-------------+---------------+----------------+
| name | descr | adminSt | authSt | server_hostname_ip | server_descr | server_preferred | server_EPG | server_minPol | server_maxPoll |
+--------------+-------------------+---------+----------+--------------------+--------------+------------------+-------------+---------------+----------------+
| test1-NTPPOL | Test NTP Policy | enabled | disabled | 10.10.10.10 | NTP1 server | yes | oob-default | 4 | 6 |
+--------------+-------------------+---------+----------+--------------------+--------------+------------------+-------------+---------------+----------------+
| | | | | 10.10.10.11 | NTP2 server | no | oob-default | 4 | 6 |
+--------------+-------------------+---------+----------+--------------------+--------------+------------------+-------------+---------------+----------------+
| | | | | 10.10.10.12 | NTP3 server | no | oob-default | 4 | 6 |
+--------------+-------------------+---------+----------+--------------------+--------------+------------------+-------------+---------------+----------------+
| test2-NTPPOL | Test 2 NTP policy | enabled | disabled | 20.10.10.10 | NTP1 server | yes | oob-default | 4 | 6 |
+--------------+-------------------+---------+----------+--------------------+--------------+------------------+-------------+---------------+----------------+
| | | | | 20.10.10.11 | NTP2 server | no | oob-default | 4 | 6 |
+--------------+-------------------+---------+----------+--------------------+--------------+------------------+-------------+---------------+----------------+
| | | | | 20.10.10.12 | NTP3 server | no | oob-default | 4 | 6 |
+--------------+-------------------+---------+----------+--------------------+--------------+------------------+-------------+---------------+----------------+
我想数据结构是这样的:我来这个样子
[
{
"name": "NTP_Policy1",
"descr": "NTP Policy 1",
"adminSt": "enabled",
"authSt": "disabled",
"servers": [
{
"hostname": "10.10.10.10",
"descr": "NTP1 Server",
"preferred": true,
"server_EPG": "oob-default",
"minPoll": 4,
"maxPoll": 6
},
{
"hostname": "20.10.10.10",
"descr": "NTP2 Server",
"preferred": false,
"server_EPG": "oob-default",
"minPoll": 4,
"maxPoll": 6
}
]
},
{
"name": "NTP_Policy2",
"descr": "NTP Policy 2",
"adminSt": "enabled",
"authSt": "disabled",
"servers": [
{
"hostname": "30.10.10.10",
"descr": "NTP3 Server",
"preferred": true,
"server_EPG": "oob-default",
"minPoll": 4,
"maxPoll": 6
},
{
"hostname": "40.10.10.10",
"descr": "NTP4 Server",
"preferred": false,
"server_EPG": "oob-default",
"minPoll": 4,
"maxPoll": 6
}
]
}
]
最接近的代码,但是后续行将子级附加到父级别。
>>> import pyexcel
>>> from pprint import pprint
>>> def excel_to_dict(sheet):
... rows = sheet.iter_rows()
... keys = next(rows)
... dict_list = []
... # For each row in the spreadsheet,
... # Create an iterator pair so that the key is iterated over at the same time as its matching cell in the row
... # Then save that pairing as descriptors of the switch
... for row in rows:
... dict = {}
... dict['servers'] = []
... server_atts = {}
... for key,cell in zip(keys, row):
... if str(cell.value) != 'None' and str(key.value) == 'name':
... dict[str(key.value)] = str(cell.value)
... parentKey = str(key.value)
... elif (str(cell.value) != 'None' and str(key.value) == 'descr') or (str(cell.value) != 'None' and str(key.value) == 'adminSt') or (str(cell.value) != 'None' and str(key.value) == 'authSt'):
... dict[str(key.value)] = str(cell.value)
... elif str(cell.value) == 'None':
... continue
... else:
... server_atts[str(key.value)] = str(cell.value)
... dict['servers'].append(server_atts.copy())
... dict_list.append(dict.copy())
... return dict_list
>>> wb = openpyxl.load_workbook('aci_config.xlsx')
>>> ntpPolsSheet = wb.get_sheet_by_name('ntp_pol')
>>> ntpPols = excel_to_dict(ntpPolsSheet)
>>>
>>> pprint(ntpPols)
[{'adminSt': 'enabled',
'authSt': 'disabled',
'descr': 'Test NTP Policy',
'name': 'test1-NTPPOL',
'servers': [{'server_EPG': 'oob-default',
'server_descr': 'NTP1 server',
'server_hostname_ip': '10.10.10.10',
'server_maxPoll': '6',
'server_minPol': '4',
'server_preferred': 'yes'}]},
{'servers': [{'server_EPG': 'oob-default',
'server_descr': 'NTP2 server',
'server_hostname_ip': '10.10.10.11',
'server_maxPoll': '6',
'server_minPol': '4',
'server_preferred': 'no'}]},
{'servers': [{'server_EPG': 'oob-default',
'server_descr': 'NTP3 server',
'server_hostname_ip': '10.10.10.12',
'server_maxPoll': '6',
'server_minPol': '4',
'server_preferred': 'no'}]},
{'adminSt': 'enabled',
'authSt': 'disabled',
'descr': 'Test 2 NTP policy',
'name': 'test2-NTPPOL',
'servers': [{'server_EPG': 'oob-default',
'server_descr': 'NTP1 server',
'server_hostname_ip': '20.10.10.10',
'server_maxPoll': '6',
'server_minPol': '4',
'server_preferred': 'yes'}]},
{'servers': [{'server_EPG': 'oob-default',
'server_descr': 'NTP2 server',
'server_hostname_ip': '20.10.10.11',
'server_maxPoll': '6',
'server_minPol': '4',
'server_preferred': 'no'}]},
{'servers': [{'server_EPG': 'oob-default',
'server_descr': 'NTP3 server',
'server_hostname_ip': '20.10.10.12',
'server_maxPoll': '6',
'server_minPol': '4',
'server_preferred': 'no'}]}]
什么代码需要看起来像正确填充字典清单?是否有更好的电子表格格式可以更容易地导入数据?我正尝试在一张纸上完成所有操作,而不是多张纸。
你可不可以为此使用'pandas'吗?它只需几行代码即可达到相同的结果。 –
你应该把它转换成'json' –
你遇到的问题是什么?数据是否按照您的预期进入? – aydow