2017-02-13 16 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

これはかなり近いと思います。私がそれを実行すると、必要な構造を作成するように見えますが、出力を見ると私の 'descr'キーはすべて空です。私は列のオブジェクトがsite_descr、building_descrなどを追加するためにコラムオブジェクトを再加工しようとしましたが、それらは列であるが 'IndexError:list index of range'エラーでエラーが発生したためです。 – mikey

+0

@mikey、私は '* _descr'カラムと' rack_dn'を検索する答えを更新しました –

+0

それはうまくいくようです。どうもありがとうございます!私は、スプレッドシートから削除することを意味していたので、rack_dn部分を削除しました。さて、コードが実際に何をしているのかわかるかどうかを知る必要があります... – mikey

関連する問題