Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将excel数据导入嵌套字典_Python_Excel_Dictionary - Fatal编程技术网

Python 将excel数据导入嵌套字典

Python 将excel数据导入嵌套字典,python,excel,dictionary,Python,Excel,Dictionary,我有一个电子表格,试图将数据导入一组嵌套的python字典。基本上,电子表格包含站点、建筑、楼层、房间、行和机架的列。我希望数据结构如下所示: sites = [ { "name": "", "descr": "", "buildings": [ { "name": "", "descr": "", "floors": [ { "name": "",

我有一个电子表格,试图将数据导入一组嵌套的python字典。基本上,电子表格包含站点、建筑、楼层、房间、行和机架的列。我希望数据结构如下所示:

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部分,因为我一直想从电子表格中删除它。现在我只需要看看我是否能弄清楚代码到底在做什么……不客气。正如我所描述的那样,希望它是可以预测的。