2016-11-27 95 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工具 –