私はPython辞書のリストを見たいと思っていますが、スプレッドシートのデータをデータ構造に取り込む際に問題があると考えています。私が持っている問題は、1つの行に、親辞書の値と1つの子を移入するデータがある可能性があるということです。後続の行では、親の列の値が空の場合、子の列が前の親に属しているとします。親データが空でない新しい行が発生した場合は、それを新しい親と見なしてリストに追加します。私はこのように見えるようなデータ構造をしたいと思います入れ子になった辞書にスプレッドシートデータを挿入する
+--------------+-------------------+---------+----------+--------------------+--------------+------------------+-------------+---------------+----------------+
| 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リストに正しく入力するにはどのようなコードが必要ですか?データを簡単にインポートできるスプレッドシート形式がありますか?私はこのシートを複数のシートではなく、1つのシートにまとめようとしています。
この目的で 'pandas'を使用できませんか?数行のコードで同じ結果が得られます。 –
あなたは 'json'に変換する必要があります –
あなたは遭遇している問題は何ですか?データは入ってきますが、あなたが期待しているものではありませんか? – aydow