У меня есть представление о том, что я хочу, чтобы мой список словарей 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'}]}]
Что должен знать код, чтобы правильно заполнить список dict? Есть ли лучший формат электронных таблиц, который может облегчить импорт данных? Я пытаюсь сделать все это на одном листе, а не на нескольких листах.
Вы не можете использовать 'pandas' для этой цели? он достигнет такого же результата с несколькими строками кода. –
, вы должны преобразовать его в 'json' –
, в чем проблема, с которой вы сталкиваетесь? данные поступают, но не так, как вы ожидаете? – aydow