2015-01-12 11 views
5

私はJsonファイルの新機能です。私は次のような複数のJSONオブジェクトとJSONファイルがある場合:1つのファイルに複数のJsonオブジェクトがあるpythonで抽出します

{"ID":"12345","Timestamp":"20140101", "Usefulness":"Yes", 
    "Code":[{"event1":"A","result":"1"},…]} 
{"ID":"1A35B","Timestamp":"20140102", "Usefulness":"No", 
    "Code":[{"event1":"B","result":"1"},…]} 
{"ID":"AA356","Timestamp":"20140103", "Usefulness":"No", 
    "Code":[{"event1":"B","result":"0"},…]} 
… 

を私は、データフレームにすべての「タイムスタンプ」と「有用性」を抽出したい:

Timestamp Usefulness 
0 20140101  Yes 
1 20140102  No 
2 20140103  No 
… 

誰もが、一般的に知っていますそのような問題に対処する方法?ありがとう!

+1

あなたのjsonオブジェクトをすべて含む単一のjson配列を持つことはかなり簡単です – njzk2

答えて

8

は形式で、JSON配列を使用します。

[ 
{"ID":"12345","Timestamp":"20140101", "Usefulness":"Yes", 
    "Code":[{"event1":"A","result":"1"},…]}, 
{"ID":"1A35B","Timestamp":"20140102", "Usefulness":"No", 
    "Code":[{"event1":"B","result":"1"},…]}, 
{"ID":"AA356","Timestamp":"20140103", "Usefulness":"No", 
    "Code":[{"event1":"B","result":"0"},…]}, 
... 
] 

を次に、あなたのPythonコードにインポート

json=open('file.json') 

data = json.load(json) 

今すぐデータの内容を表す辞書を持つ配列であります各要素

あなたはつまり、簡単にアクセスできます。配列内のデータを含むカップルのコメントで述べたように簡単です、だから、

data[0]["ID"] 
+9

これはクールですが、ファイルをエンドレスストリーム(例:ログのような追加専用ファイルデータ)として使用することを防ぎ、さらに多くのメモリを消費します。 – exa

+0

いくつかのケースでは、たくさんの...私の持つ記憶以上のもの。 –

0

オブジェクトを解析するときに、辞書を扱います。キーで検索することで、必要な値を抽出することができます。例えば。 value = jsonDictionary['Usefulness']

forループを使用してjsonオブジェクトをループできます。例えば:

for obj in bunchOfObjs: 
    value = obj['Usefulness'] 
    #now do something with your value, e.g insert into panda.... 
0

が、解決策は、データとして効率の点でうまくスケールしませんセットサイズが大きくなります。配列内のランダムなオブジェクトにアクセスする場合は、イテレータのみを使用する必要があります。そうでなければ、ジェネレータが移動する方法です。以下では、各jsonオブジェクトを個別に読み込み、ジェネレータを返すリーダ関数のプロトタイプを作成しました。

基本的な考え方は、キャリッジキャラクタ "\ n"(またはWindowsでは "\ r \ n")で分割するようにリーダーに知らせることです。 Pythonはファイル .readline()関数でこれを行うことができます。

ただし、このメソッドは、ファイルが作成されているときにのみ動作します。各オブジェクトは改行文字で区切られています。以下では、jsonオブジェクトの配列を区切り、それぞれを新しい行に保存する作者の例を書きました。

def json_writr(file, json_objects): 
    f = open(file, mode="w") 
    for jsonobj in json_objects: 
     jsonstr = json.dumps(jsonobj) 
     f.write(jsonstr+"\n") 
    f.flush() 
    f.close() 

あなたはまた、(ファイル .writelinesと同じ操作を行うことができます)、リスト内包表記

... 
    jsobjs = [json.dumps(j)+"\n" for j in json_objects] 
    f.writelines(jsobjs) 
... 

そして、あなたが代わりに新しいファイルを書くのデータを追加したい場合は、単に 'モードを変更します= "w" 'を' mode = "a" 'に設定します。

最後に、これはテキストエディタでjsonファイルを開こうとすると読みやすくするだけでなく、メモリをより効率的に使用するという点でも大いに役立ちます。

ある点を気にして読者のリストを欲しければ、Pythonではジェネレータ関数をリストの中に入れてリストを自動的に埋めることができます。言い換えれば、単に書き込みます。

lst = list(json_readr(file)) 

希望します。それは少し冗長だった場合は申し訳ありません。

関連する問題