2017-01-04 20 views
0

このテキストファイルをjsonに変換するにはどうすればよいですか?最終的に、私はNoSQLデータベースにjsonブロブを挿入しますが、今のところ私はテキストファイルを解析してpython dictを作成し、jsonにダンプします。Python - テキストファイルをdictに変換してjsonに変換する

私はちょうど私が見ていない/次の(私はPythonに新しいです)のディクテーションの理解でこれを行う方法があると思う。ファイルの

例:私はJSONに変換するために構築したい辞書の

file_1.txt 
[namespace1] => metric_A = value1 
[namespace1] => metric_B = value2 
[namespace2] => metric_A = value3 
[namespace2] => metric_B = value4 
[namespace2] => metric_B = value5 

例:

{ "file1" : { 
      "namespace1" : { 
       "metric_A" : "value_1", 
       "metric_B" : "value_2"  
      }, 
      "namespace2" : { 
       "metric_A" : "value_3", 
       "metric_B" : ["value4", "value5"] 
      } 
} 

(私は現在、この作業を持っていますが、私のコードは、総混乱で、この例よりずっと複雑なクリーンアップなど)。私は基本的にファイルを一行ずつ、python dictを構築しています。私はdictに存在するために各名前空間をチェックします。もし存在するならば、私はメトリックをチェックします。メトリックがすでに存在する場合は、重複があり、既存の値と新しい値が含まれている配列に値を変換する必要があることがわかります。もっとシンプルでクリーンな方法が必要です。

答えて

2
import glob 
import json 

answer = {} 
for fname in glob.glob(file_*.txt): # loop over all filenames 
    answer[fname] = {} 
    with open(fname) as infile: 
     for line in infile: 
      line = line.strip() 
      if not line: continue 
      splits = line.split()[::2] 
      splits[0] = splits[0][1:-1] 
      namespace, metric, value = splits # all the values in the line that we're interested in 
      answer[fname].get(namespace, {})[metric] = value # populate the dict 

required_json = json.dumps(answer) # turn the dict into proper JSON 
+0

私は決して非常に強力なスライス表記法を使用しません。ありがとう! – user797963

1

これには正規表現を使用できます。 re.findall('\w+', line)はあなたの後ろにあるすべてのテキストグループを見つけ、残りはそれを辞書の辞書に保存します。これを行う最も簡単な方法はdefaultdictからcollectionsまでです。

import re 

from collections import defaultdict 

answer = defaultdict(lambda: defaultdict(lambda: [])) 

with open('file_1.txt', 'r') as f: 
    for line in f: 
     namespace, metric, value = re.findall(r'\w+', line) 
     answer[namespace][metric].append(value) 

我々は正確に3 alphanumグループを期待していることを、知っているように、我々は3変数、すなわちnamespace, metric, valueに割り当てます。最後にdefaultdictは、名前空間を最初に見た場合のdefaultdictを返します。内側のdefaultdictは、最初の追加時に空の配列を返し、コードをよりコンパクトにします。

+0

複数の値がある場合は配列に簡単に変換できませんでしたが、これは素晴らしいです。 – user797963

+0

@ user797963、これは簡単に修正できます。そこでは、毎回その値を上書きしています。代わりに 'answer = defaultdict(lambda:defaultdict(lambda:[]))をし、最後の行を' answer [namespace] [metric] .append(value)に更新することです。 良いことは、データ構造内の型の一貫性です。つまり、要素が1つでもあっても、それが配列であることはまだまだ優れています。 私は答えを更新しました。 – Jarek

関連する問題