Python 将excel数据导入嵌套字典
我有一个电子表格,试图将数据导入一组嵌套的python字典。基本上,电子表格包含站点、建筑、楼层、房间、行和机架的列。我希望数据结构如下所示:Python 将excel数据导入嵌套字典,python,excel,dictionary,Python,Excel,Dictionary,我有一个电子表格,试图将数据导入一组嵌套的python字典。基本上,电子表格包含站点、建筑、楼层、房间、行和机架的列。我希望数据结构如下所示: sites = [ { "name": "", "descr": "", "buildings": [ { "name": "", "descr": "", "floors": [ { "name": "",
sites = [
{
"name": "",
"descr": "",
"buildings": [
{
"name": "",
"descr": "",
"floors": [
{
"name": "",
"descr": "",
"rooms": [
{
"name": "",
"descr": "",
"rows": [
{
"name": "",
"descr": "",
"racks": [
{
"name": "",
"descr": ""
}
]
}
]
}
]
}
]
}
]
}
]
电子表格的一个例子是:
+------+---------------+----------+----------------+-------+-------------+------+------------+-----+-----------+------+------------+-------------------------------------------------------------------+
| site | site_descr | building | building_descr | floor | floor_descr | room | room_descr | row | row_descr | rack | rack_descr | rack_dn |
+------+---------------+----------+----------------+-------+-------------+------+------------+-----+-----------+------+------------+-------------------------------------------------------------------+
| dc1 | Data Center 1 | alpha | Alpha Building | 1 | Floor 1 | 100 | Room 100 | A | Row A | A5 | Rack A5 | uni/fabric/site-dc1/building-alpha/floor-1/room-100/row-A/rack-A5 |
+------+---------------+----------+----------------+-------+-------------+------+------------+-----+-----------+------+------------+-------------------------------------------------------------------+
| dc1 | Data Center 1 | alpha | Alpha Building | 1 | Floor 1 | 100 | Room 100 | A | Row A | A5 | Rack A5 | uni/fabric/site-dc1/building-alpha/floor-1/room-100/row-A/rack-A5 |
+------+---------------+----------+----------------+-------+-------------+------+------------+-----+-----------+------+------------+-------------------------------------------------------------------+
| dc1 | Data Center 1 | alpha | Alpha Building | 1 | Floor 1 | 200 | Room 200 | A | Row A | A5 | Rack A5 | uni/fabric/site-dc1/building-alpha/floor-1/room-200/row-A/rack-A5 |
+------+---------------+----------+----------------+-------+-------------+------+------------+-----+-----------+------+------------+-------------------------------------------------------------------+
| dc1 | Data Center 1 | alpha | Alpha Building | 1 | Floor 1 | 100 | Room 100 | B | Row B | B5 | Rack B5 | uni/fabric/site-dc1/building-alpha/floor-1/room-100/row-B/rack-B5 |
+------+---------------+----------+----------------+-------+-------------+------+------------+-----+-----------+------+------------+-------------------------------------------------------------------+
| dc1 | Data Center 1 | alpha | Alpha Building | 2 | Floor 2 | 100 | Room 100 | A | Row A | A7 | Rack A7 | uni/fabric/site-dc1/building-alpha/floor-2/room-100/row-A/rack-A7 |
+------+---------------+----------+----------------+-------+-------------+------+------------+-----+-----------+------+------------+-------------------------------------------------------------------+
| dc2 | Data Center 2 | beta | Beta Building | 5 | Floor 5 | 200 | Room 200 | B | Row B | B5 | Rack B5 | uni/fabric/site-dc2/building-beta/floor-5/room-200/row-B/rack-B5 |
+------+---------------+----------+----------------+-------+-------------+------+------------+-----+-----------+------+------------+-------------------------------------------------------------------+
将此信息输入到我的数据结构中的最佳方法是什么?pyexcel模块可以导入记录,这实际上创建了一个字典列表,每行作为列表中的一个条目。我对重组这个的逻辑有问题
我应该在for循环之前初始化结构吗?我应该在填充结构时构建它吗?如果我用下面这样的空格初始化结构,我需要确保我的第一行填充了这些空格,这使我认为后者可能是更好的选择。我认为要做的事情是迭代列名,查找具有正确列名的字典,如果它不存在,则创建它,然后前进到它的子数组中:
import pprint
columns = ['site', 'building', 'floor', 'room', 'row', 'rack']
keys = ['buildings', 'floors', 'rooms', 'rows', 'racks']
def find(seq, pred):
try:
found = next(x for x in seq if pred(x))
except StopIteration:
found = None
return found
def add_record(sites, record):
array = sites
for index, column in enumerate(columns):
name = record[column]
descr = record[column + '_descr']
dictionary = find(array, lambda x: x['name'] == name)
if dictionary is None:
dictionary = {'name': name, 'descr' : descr}
if column != 'rack':
dictionary[keys[index]] = []
array.append(dictionary)
if column != 'rack':
array = dictionary[keys[index]]
else:
dictionary['rack_dn'] = record['rack_dn']
def main():
records = [{'site': 'dc1', 'site_descr' : 'Data Center 1', 'building' : 'alpha',
'building_descr': 'Alpha Building', 'floor' : 1, 'floor_descr' : 'Floor 1',
'room' : 100, 'room_descr' : 'Room 100', 'row' : 'A', 'row_descr': 'Row A',
'rack': 'A5', 'rack_descr' : 'Rack A5',
'rack_dn' : 'uni/fabric/site-dc1/building-alpha/floor-1/room-100/row-A/rack-A5'},
{'site': 'dc1', 'site_descr' : 'Data Center 1', 'building' : 'alpha',
'building_descr': 'Alpha Building', 'floor' : 1, 'floor_descr' : 'Floor 1',
'room' : 200, 'room_descr' : 'Room 200', 'row' : 'A', 'row_descr': 'Row A',
'rack': 'A5', 'rack_descr' : 'Rack A5',
'rack_dn' : 'uni/fabric/site-dc1/building-alpha/floor-1/room-200/row-A/rack-A5'},
{'site': 'dc2', 'site_descr' : 'Data Center 2', 'building' : 'beta',
'building_descr': 'Beta Building', 'floor' : 5, 'floor_descr' : 'Floor 5',
'room' : 200, 'room_descr' : 'Room 200', 'row' : 'B', 'row_descr': 'Row B',
'rack': 'B5', 'rack_descr' : 'Rack B5',
'rack_dn' : 'uni/fabric/site-dc2/building-beta/floor-5/room-200/row-B/rack-B5'}]
sites = []
for record in records:
add_record(sites, record)
pp = pprint.PrettyPrinter()
pp.pprint(sites)
这个问题将从一个例子中受益匪浅。这使我们更容易帮助你。具体来说,这里没有示例数据,也没有您已经尝试过的任何代码。@Stephernauch我用我正在使用的电子表格更新了我的帖子。我还没有任何真正的代码,因为我甚至在开始时都有困难。我觉得我需要使用“setdefault”字典选项来完成一些工作……我认为这非常接近。当我运行它时,它看起来创建了我需要的结构,但是当我查看输出时,我所有的“descr”键都是空的。我尝试重新处理columns对象以添加site_descr、building_descr等,因为这些都是列,但由于“IndexError:list index out range”错误而出错。@mikey,我已更新了我的答案,以检索
*\u descr
列和机架dn
,它们似乎工作正常。非常感谢你!我删除了rack_dn部分,因为我一直想从电子表格中删除它。现在我只需要看看我是否能弄清楚代码到底在做什么……不客气。正如我所描述的那样,希望它是可以预测的。