2017-02-13 2 views
0

У меня есть таблица, которую я пытаюсь импортировать данные в набор вложенных словарей python. По существу, в таблице есть столбцы для сайта, здания, пола, комнаты, ряда и стойки. Я хотел бы структуру данных, чтобы выглядеть следующим образом:Импорт данных excel во вложенный словарь

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? Должен ли я просто строить структуру, когда я ее заполняю? Если я инициализирую структуру пробелами, как показано ниже, мне нужно будет убедиться, что моя первая строка заполняет эти пробелы, что заставляет меня думать, что последний может быть лучшим вариантом.

+0

Этот вопрос принесет большую пользу из примера [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve). Это облегчает нам помощь. В частности, нет данных о образцах и никакого кода, который вы уже пробовали. –

+0

@StephenRauch Я обновил свой пост с электронной таблицы, с которой я работаю. У меня пока нет никакого реального кода, потому что у меня возникают проблемы даже с началом работы. Я чувствую, что мне нужно использовать параметр слова «setdefault», чтобы сделать некоторые из этого ..... – mikey

ответ

0

Я думаю, что нужно сделать, это перебирать имена столбцов, искать словарь с правильным именем для столбца, создайте его, если он не существует, а затем продвигаться в своем массиве детей:

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) 
+0

Я думаю, что это довольно близко. Когда я запускаю его, он ищет структуру, которая мне нужна, но все мои «дескрипторы» пустые, когда я смотрю на вывод. Я попытался переработать объект столбцов, чтобы добавить site_descr, building_descr и т. Д., Так как это столбцы, но это ошибки с ошибкой IndexError: list index out the range. – mikey

+0

@mikey, я обновил свой ответ, чтобы получить столбцы '* _descr' и' rack_dn' –

+0

Это похоже на работу. Спасибо огромное! Я удалил часть rack_dn, потому что я имел в виду удалить ее из электронной таблицы. Теперь мне просто нужно выяснить, могу ли я понять, что делает код на самом деле ... – mikey

Смежные вопросы