我對我希望我的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