2017-02-24 18 views
0

私は最後にjsonファイルを提供するためにexcelファイルからデータを読み込むためにopenpyxlを使用します。問題は、json(またはPython辞書)の階層構造を行うアルゴリズムを理解できないことです。Python - マルチレベル1、1.1、1.1.1、1.1.2(階層的)の名前で辞書に追加する

データ形式は、次のようなものです:

Table

出力は次のようにする必要があります:ここで

{ 
'id'  : '1', 
'name'  : 'first', 
'value' : 10, 
'children': [ { 
       'id' : '1.1', 
       'name' : 'ab', 
       'value': 25, 
       'children' : [ 
        { 
        'id' : '1.1.1', 
        'name' : 'abc' , 
        'value': 16, 
        'children' : [] 
        } 
       ] 
       }, 
       { 
       'id' : '1.2', 
       ... 
      ] 
} 


は、私が出ているものですが、私はすることができます」 '1.1.1'と '1.1.1.1'などは1.1と同じレベルになるため、 '1.1'を超えます。

from openpyxl import load_workbook 
import re 
from json import dumps 

wb = load_workbook('resources.xlsx') 
sheet = wb.get_sheet_by_name(wb.get_sheet_names()[0]) 
resources = {} 
prev_dict = {} 
list_rows = [ row for row in sheet.rows ] 
for nrow in range(list_rows.__len__()): 
    id = str(list_rows[nrow][0].value) 
    val = { 
    'id'  : id, 
    'name'  : list_rows[nrow][1].value , 
    'value'  : list_rows[nrow][2].value , 
    'children' : [] 
    } 
    if id[:-2] == str(list_rows[nrow-1][0].value): 
     prev_dict['children'].append(val) 
    else: 
     resources[nrow] = val 
     prev_dict = resources[nrow] 

print dumps(resources) 

答えて

2

あなたはIDによって、あなたのデータにアクセスする必要があるので、最初のステップは、IDが鍵である辞書を作成することです。データ操作を容易にするために、文字列"1.2.3"("1","2","3")タプルに変換されます。 (リストはdictキーとして許可されていません)。これにより、親キーの計算が非常に簡単になります(key[:-1])。

この準備では、各アイテムの親の子リストを簡単に取り込むことができます。しかし、その前に特別なROOT要素を追加する必要があります。これはトップレベルのアイテムの親です。

それだけです。コードは以下の通りです。

注#1:すべてのアイテムに親があることが必要です。それで、1.2.2がテストデータに追加されました。そうでない場合は、記載されているKeyErrorを処理してください。

注2:結果はリストです。

import json 

testdata=""" 
1 first 20 
1.1 ab 25 
1.1.1 abc 16 
1.2 cb 18 
1.2.1 cbd 16 
1.2.1.1 xyz 19 
1.2.2 NEW -1 
1.2.2.1 poz 40 
1.2.2.2 pos 98 
2 second 90 
2.1 ezr 99 
""" 

datalist = [line.split() for line in testdata.split('\n') if line] 
datadict = {tuple(item[0].split('.')): { 
       'id': item[0], 
       'name': item[1], 
       'value': item[2], 
       'children': []} 
      for item in datalist} 
ROOT =() 
datadict[ROOT] = {'children': []} 
for key, value in datadict.items(): 
    if key != ROOT: 
     datadict[key[:-1]]['children'].append(value) 
     # KeyError = parent does not exist 

result = datadict[ROOT]['children'] 
print(json.dumps(result, indent=4)) 
+0

おかげで、 – asm

関連する問題