2017-01-19 152 views
1

我有4个项目。如何添加字典中的字典

item['bigCtgr'] = 'item' 
item['smaCtgr'] = 'food' 
item['ssCtgr'] = 'apple' 
item['sCtgr'] = 'red' 

我将多次添加到process_item。 所以我想让这样的结构。 喜欢的东西

{"item" : 
    {"food": 
     {"apple": 
      {"green":NULL}, 
      {"red":NULL}}, 
     {"banana": 
      {"yellow":NULL}, 
      {"green":NULL}}, 
    } 
    {"sweet": 
     {"candy": 
      {"yellow":NULL}} 
    } 
} 

类别,但我的代码不能正常工作,我不知道为什么。

class CategoryPipeline(object): 
    global ctgr 
    ctgr = {} 

    def __init__(self): 
     global file 
     file = open("test.json","w") 

    def process_item(self, item, spider): 

     if item['bigCtgr'] not in ctgr.keys(): 
      ctgr[item['bigCtgr']] = {item['smaCtgr']: {item['ssCtgr'] : {item['sCtgr'] : 'NULL'}}} 
     if item['smaCtgr'] not in ctgr[item['bigCtgr']].keys(): 
      ctgr[item['bigCtgr']][item['smaCtgr']] = {item['ssCtgr']: {item['sCtgr'] : 'NULL'}} 
     elif item['ssCtgr'] not in ctgr[item['bigCtgr']][item['smaCtgr']].keys(): 
      ctgr[item['bigCtgr']][item['smaCtgr']][item['ssCtgr']] = {item['sCtgr'] : 'NULL'} 
     else: 
      ctgr[item['bigCtgr']][item['smaCtgr']][item['ssCtgr']][item['sCtgr']] = 'NULL' 


    def __del__(self): 
     b = json.dumps(ctgr, ensure_ascii=False).encode('utf-8') 
     file.write(b) 
     file.write('\n') 
     file.close() 

我该如何编码?

+0

不太清楚,你想的瓦莱斯为'NULL','bigCtgr'的意义是什么等 –

+0

我只想使用仅字典的层次结构.. – Amily

+0

你可以把它作为样本输入和期望的输出,所以我可以更好地测试它和t ry给你一个答案 –

回答

2

我用dict和__missing__函数实现了一棵树。这增加的节点,如果不存在

import json 

class CategoryNode(dict): 
    def __missing__(self,key): 
     self[key] = CategoryNode() 
     return self[key] 
    def add_item(self, item): 
     self[item['bigCtgr']][item['smaCtgr']][item['ssCtgr']][item['sCtgr']] = CategoryNode() 



class CategoryPipeline(object): 
    ctgr = CategoryNode() 
    file = "test.json" 

    def process_item(self, item, spider): 
     CategoryPipeline.ctgr.add_item(item) 

    def json(self): 
     json.dump(CategoryPipeline.ctgr,open(CategoryPipeline.file,'w'), ensure_ascii=False, encoding='utf-8') 

呢?这就是你为什么要用它

cp = CategoryPipeline() 
item = {} 
item['bigCtgr'] = 'item' 
item['smaCtgr'] = 'food' 
item['ssCtgr'] = 'apple' 
item['sCtgr'] = 'red' 
item2 = {} 
item2['bigCtgr'] = 'item' 
item2['smaCtgr'] = 'food' 
item2['ssCtgr'] = 'Orange' 
item2['sCtgr'] = 'orange' 
cp.process_item(item,"Yo") 
cp.process_item(item2,"Yo") 
cp.json() 
+0

真的真的很感谢你, 我会试试这个方法! – Amily

+0

我已经清理了一些代码。如果它帮助您解决问题,请接受答案 –

0

而且我发现这个功能

class CategoryPipeline(object): 
    global inf_dict, ctgr 
    inf_dict = lambda: collections.defaultdict(inf_dict) 
    ctgr = inf_dict() 

    def __init__(self): 
     global file 
     file = open("test.json","w") 

    def process_item(self, item, spider): 
     ctgr[item['bigCtgr']][item['smaCtgr']][item['ssCtgr']][item['sCtgr']] = 'NULL' 


    def __del__(self): 
     b = json.dumps(ctgr, ensure_ascii=False).encode('utf-8') 
     file.write(b) 
     file.write('\n') 
     file.close()