2016-11-27 14 views
1

私はopenFDAから2015年の有害事象のイベントデータをダウンロードしました。私はPythonでいくつか分析したいと思います。圧縮されたJSONファイルを読む

JSONデコードが動作しない場合があります。

gzipのコードスニペットは見つかりましたが、普通のzipファイルは見つかりませんでした。

私が取得エラーメッセージは次のとおりです。

TypeError: the JSON object must be str, not 'bytes' 

JSONファイルが大きいです。 jsonstreamerijson、または別のライブラリが推奨ツールですか?

JSONファイルは、この(手動解凍後)のようになります。

{ 
    "meta": { 
    "last_updated": "2016-11-18", 
    "terms": "https://open.fda.gov/terms/", 
    "results": { 
     "skip": 0, 
     "total": 304100, 
     "limit": 25000 
    }, 
    "license": "https://open.fda.gov/license/", 
    "disclaimer": "Do not rely on openFDA to make decisions regarding medical care. While we make every effort to ensure that data is accurate, you should assume all results are unvalidated. We may limit or otherwise restrict your access to the API in line with our Terms of Service." 
    }, 

これは私のコードです:

import json 
import zipfile 

d = None 
data = None 
with zipfile.ZipFile("./data/drug-event-Q4-0001-of-0013.json.zip", "r") as z: 
    for filename in z.namelist(): 
     print(filename) 
     with z.open(filename) as f: 
     data = f.read() 
     d = json.loads(data) 

答えて

2

あなたはzipファイルから読み取られたデータバイトです。 Jsonデコーダは代わりにテキストを必要とします。そう;この種の問題ではいつものように、バイトを文字列にデコードしてから、jsonモジュールに入力する必要があります。

私は、これはトリックを行いますので、JSONファイルはUTF-8エンコーディングで保存されていると仮定しています:

d = json.loads(data.decode("utf-8")) 

変更文字エンコーディングをそれに応じてJSONファイルが別のエンコーディングである場合。

2番目の質問について:「大きい」の大きさは?

+0

ありがとうございました。それはうまくいきました。私はそれを見逃してしまったと感じました。特に明らかなエラーメッセージがありました。私の最大のファイルは約400MBです –

+0

400 Mbの圧縮されていないjsonまたは400 Mbの圧縮されたソースファイルですか?後者の場合、実際のjsonファイルがコンピュータのメモリにとって大きすぎる可能性があります。その後、ストリーミングjsonプロセッサが確かに調査対象となります –

+0

また、どの分析をしたいのかに応じて、ドキュメントデータベースに格納しますmongodbのようなものも同様に見えるものかもしれません。これにより、さまざまな方法でjsonデータを照会することができます(プロパティーの選択、属性の投影、ソートおよび集約...)。 MongoDbはmongoimportツールを使って信じているjsonデータを直接インポートできます –

関連する問題