2016-10-18 8 views
1

私は基本的に私はすべてを収集する必要があるマッピングcsvファイル

{ 
     "name": "Data", 
     "children": [{ 
      "name": "category1", 
      "children": [{ 
       "name": "2010", 
       "children": [ 
        {"name": "deatil1"}, 
        {"name": "detail2"} 
       ], 
       "name": "2011", 
       "children": [ 
        {"name": "detail3"} 
       ] 
      }, { 
      }] 
     }, 
      { 
      "name": "category2", 
      "children": [{ 
        "name": "2011", 
        "children": [{ 
         "name": "detail4" 
        }] 
       } 
      ] 
     } 
    ] 
    } 

の形でJSONにそれをマッピングする必要があり

"category1", 2010, "deatil1" 
"category1", 2010, "deatil2" 
"category1", 2011, "deatil3" 
"category2", 2011, "deatil4" 

の形でcsvファイル内のデータを持っています一意のカテゴリと年のペアの詳細とリストを配置

入れ子構造のディクテーション構造を使用しようとしましたが、出力が正しくありません。

私は、辞書の入れ子のネストを処理するカスタムdictクラスを作成しました。次のコードは、正しい構造のデータを収集しますが、正しい形式で出力する方法はわかりません。どんな助けでも大歓迎です。

class Vividict(dict): 

    def __missing__(self, key): 
     value = self[key] = type(self)() 
     return value 

dict = Vividict() 

for row in ws.iter_rows(row_offset=1): 
    sector = row[0].value 
    year = row[2].value 
    detail = row[1].value 
    dict[sector][year][detail] 

print json.dumps(dict).encode('utf8') 

答えて

3

dict構造からは、新しいデータ構造を構築することです。私はここでdictが作成され、主にリストの内包表記を使用しています:

import json 

rows = [ 
    ("category1", 2010, "deatil1"), 
    ("category1", 2010, "deatil2"), 
    ("category1", 2011, "deatil3"), 
    ("category2", 2011, "deatil4")] 

class Vividict(dict): 
    def __missing__(self, key): 
     value = self[key] = type(self)() 
     return value 

dict = Vividict() 

for row in rows: 
    sector = row[0] 
    year = row[1] 
    detail = row[2] 
    dict[sector][year][detail] 

# This is the new data structure, derived from the existing 'dict' 
d = {'name': 'Data', 
    'children': [ 
     {'name': k1, # sector 
      'children': [ 
         {'name': k2, # year 
         'children': [ 
          { 
          'name': k3 # deatil 
          } for k3 in v2.keys()] 
         } for k2, v2 in v1.iteritems()] 
      } for k1, v1 in dict.iteritems()] 
    } 

print json.dumps(d).encode('utf8') 

は、ここでは、アクションでそれを参照してください。https://eval.in/662805

+1

実はあなたは辞書内包表記を使用しています! – Parfait

+0

非常にエレガントなソリューション+1、ありがとう – Jessica