2016-11-27 98 views
1

我從openFDA下載了2015年的不良藥物事件數據,我想用Python進行一些分析。閱讀壓縮的JSON文件

我無法讓JSON解碼工作。

我能夠找到gzip的代碼片段,但不能找到純zip文件。

該錯誤消息我得到的是:

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

的JSON文件很大。是jsonstreamer,ijson,還是其他庫推薦的工具?

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

您從壓縮文件中讀取的數據是字節。 Json解碼器需要文本。所以;像往常一樣的這種問題,你必須解碼字節串入一個字符串,然後將其提供給json模塊。因此

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

更改字符編碼,如果你的JSON文件在不同的編碼:

我假設JSON文件都保存在UTF-8編碼所以這將這樣的伎倆。

關於你的第二個問題:「大」有多大?

+0

謝謝你,工作,並感到有點懊惱,我錯過了,特別是與一個相當明顯的錯誤信息。我最大的文件大約是400MB –

+0

400 Mb解壓縮json或400 Mb壓縮源文件?如果是後者,其中的實際json文件可能對您的計算機的內存來說太大,然後流式json處理器肯定是要調查的東西 –

+0

也取決於您想要對它進行哪種分析,將其存儲在文檔數據庫中例如mongodb也可能是需要看的東西。這允許您以各種方式查詢json數據(屬性選擇,屬性投影,排序和聚合......)。 MongoDb可以直接導入json數據我相信使用mongoimport工具 –