2017-02-26 26 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"ラインだけで(後で"Table"ライン用の辞書で使用されている)keyspace変数を更新しながら、あなたは、あなたのコードを変更することができます。

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

この種の操作を行うには、パンダを使用できます。これは何

[{'{#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最後の行があると評価

    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') 
    

  2. 空のKP値を前の行の値で埋めてください。
  3. TABLEがヌルでないすべての値を辞書として出力します。
+0

素晴らしいチップのおかげで。これは私のためにもうまくいく可能性があります。 – mobu