2017-02-26 108 views
0

我想用python解析cassandra cfstats。到目前为止我已经取得了一些成功,但是我无法以我想要的格式获得我的字典。我很接近,但还没有。Python 2级联/嵌套字典

JSON结构,我想:

{ 
"data": [{ 
    "{#KP}": "system_traces", 
    "{#TABLE}": "events" 
}, { 
    "{#KP}": "system_traces", 
    "{#TABLE}": "sessions" 
}, { 
    "{#KP}": "system", 
    "{#TABLE}": "IndexInfo" 
}] 
} 

JSON我越来越:

{ 
"data": [{ 
    "{#KP}": "system_traces" 
}, { 
    "{#TABLE}": "events" 
}, { 
    "{#TABLE}": "sessions" 
}, { 
    "{#KP}": "system" 
}, { 
    "{#TABLE}": "IndexInfo" 
}, { 
    "{#TABLE}": "available_ranges" 
}, { 
    "{#TABLE}": "batches" 
}, { 
    "{#TABLE}": "batchlog" 
}, { 
    "{#TABLE}": "built_views" 
}] 
} 

代码我到目前为止有:

def parse_values(self, text): 
    text = text.strip().split('\n') 
    values = [] 

    for line in text: 
     cfstats = {} 
     line = line.strip() 
     if not line or line.startswith('-'): 
      continue 

     name, value = line.strip().split(': ', 1) 

     # append keyspaces and tables to list 
     if name == "Keyspace": 
      cfstats['{#KP}'] = value 
      values.append(cfstats) 
     elif name == "Table": 
      cfstats['{#TABLE}'] = value 
      values.append(cfstats) 

    return json.dumps({'data': values}) 

有没有办法在加入/级联字典Python 2?

+0

你得到的输出表明你有更多的'Table'条目比你在期望的输出中显示的多。那些你期望会发生什么?你想为每一个重复相同的#KP值吗? – Blckknght

+0

是的,这正是我想要的:-) – mobu

回答

0

你可以改变你的代码,这样你只为"Table"线创建词典,而"Keyspace"线刚刚更新keyspace变量(这是在字典用于以后"Table"线):

def parse_values(self, text): 
    text = text.strip().split('\n') 
    values = [] 
    keyspace = None 

    for line in text: 
     line = line.strip() 
     if not line or line.startswith('-'): 
      continue 

     name, value = line.strip().split(': ', 1) 

     if name == "Keyspace": 
      keyspace = value 
     elif name == "Table": 
      values.append({'{#KP}': keyspace, '{#TABLE}': value}) 

    return json.dumps({'data': values}) 
+0

这对我有效,谢谢黑骑士! – mobu

0

你可以用熊猫做这种操作。

import pandas as pd 

dd = pd.read_json(json_data)['data'].apply(pd.Series) 
dd['{#KP}'] = dd['{#KP}'].fillna(method='ffill') 
dd[pd.notnull(dd['{#TABLE}'])].to_dict('records') 

当最后一行的计算结果为:

[{'{#KP}': 'system_traces', '{#TABLE}': 'events'}, 
{'{#KP}': 'system_traces', '{#TABLE}': 'sessions'}, 
{'{#KP}': 'system', '{#TABLE}': 'sessions'}, 
{'{#KP}': 'system', '{#TABLE}': 'IndexInfo'}, 
{'{#KP}': 'system', '{#TABLE}': 'available_ranges'}, 
{'{#KP}': 'system', '{#TABLE}': 'batches'}, 
{'{#KP}': 'system', '{#TABLE}': 'batchlog'}, 
{'{#KP}': 'system', '{#TABLE}': 'built_views'}] 

这个作用:

  1. 读取JSON成数据帧。
  2. 使用前一行的值填充空KP值
  3. 发出TABLE不为空的所有值作为字典。
+0

感谢您的精彩提示。这对我来说也可以工作。 – mobu