如何利用Python解析超大的json数据(GB级别)

使用Python解析各种格式的数据都很方便,比如json、txt、xml、csv等。用于处理简单的数据完全足够用了,而且代码简单易懂。

前段时间我遇到一个问题,如何解析超大的json文件呢?刚开始天真的我在使用json.load直接加载json文件,然而内存报错却给了我当头一棒,json.load它是直接将数据加载到内存中然后解析出来的,这说明什么呢?当你的json文件过于庞大的时候,你的电脑内存装不下你的json文件,这时候就相当尴尬了,加载不了,解析不了!!

怎么办呢?我赶紧上网查阅资料,网上大部份资料都是基于分块的思路解决超大数据文件的解析的,比如read函数可以一块一块加载,像这样read(1024)每次读取1024字节,总能将数据读取完的。或者是readline函数,每次读取一行,这个函数的读取方式特别适合txt、csv文件。然而这样的函数对于json格式的数据就完全不适用了,因为json格式的文件是有严格的结构的。你不可能一块一块的或者一行一行的读取,噢不对,你可以这样读取,但是你这样读取出来的数据是完全没有意义的,因为无法解析,你无法获得你想要的数据。

块读取的方式不行,那该怎么办呢,流式读取呗,这时候我想起了万能的GitHub,上去Github搜索python json parser。看看我发现了什么!!!

啊,太棒了,光看简介基于python的迭代的json解析器,我感觉我的问题可能要被解决掉了。

果不其然,ijson完美的解决了我的问题,它抽取了json文件的特征形成了一个生成器的东西,下面举一个实例。

{
  "earth": {
    "europe": [
      {
        "name": "Paris",
        "type": "city",
        "info": "aaa"
      },
      {
        "name": "Thames",
        "type": "river",
        "info": "sss"
      },
      {
        "name": "yyy",
        "type": "city",
        "info": "aaa"
      },
      {
        "name": "eee",
        "type": "river",
        "info": "sss"
      }
    ],
    "america": [
      {
        "name": "Texas",
        "type": "state",
        "info": "jjj"
      }
    ]
  }
}

这是一个简单的json文件,用它来演示json的效果。

import ijson
​
with open('test.json', 'r', encoding='utf-8') as f:
    objects = ijson.items(f, 'earth.europe.item')
    #这个objects在这里就是相当于一个生成器,可以调用next函数取它的下一个值
    while True:
        try:
            print(objects.__next__())
        except StopIteration as e:
            print("数据读取完成")
            break

很好,接下来看一下效果如何。

{'name': 'Paris', 'type': 'city', 'info': 'aaa'}
{'name': 'Thames', 'type': 'river', 'info': 'sss'}
{'name': 'yyy', 'type': 'city', 'info': 'aaa'}
{'name': 'eee', 'type': 'river', 'info': 'sss'}
数据读取完成

是不是很棒呢?

这样不会出现内存撑爆了的错误,因为它类似于生成器的方式流式读取json数据,熟悉生成器的朋友应该就很清楚了。

如果想要加速读取解析json文件,可以加上threading多线程模块。这里就不做演示了。

另外附上ijson模块的文档地址:https://pypi.org/project/ijson/文档本人就看了一部分。更多的内容没有深入了解,有兴趣的大佬可以深入研究下。

总结

到此这篇关于如何利用Python解析超大json数据的文章就介绍到这了,更多相关Python解析大json数据内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 关于Python中request发送post请求传递json参数的问题

    昨天遇到了一个奇怪的问题,在Python中需要传递dict参数,利用json.dumps将dict转为json格式用post方法发起请求: params = {"score":{"gt":"80", "lt":"90"}} request.post(url, json.dumps(params)) 但是在服务端接收到的参数日志为: Parameters: {"sno"=>"

  • Python实现yaml与json文件批量互转

    目录 1. 安装yaml库 2. yaml转json 3. json转yaml 4. 批量将yaml与json文件互相转换 1. 安装yaml库 想要使用python实现yaml与json格式互相转换,需要先下载pip,再通过pip安装yaml库. 如何下载以及使用pip,可参考:pip的安装与使用,解决pip下载速度慢的问题 安装yaml库: pip install pyyaml 2. yaml转json 新建一个test.yaml文件,添加以下内容: A: hello: name: Mich

  • python转换wrf输出的数据为网页可视化json格式

    目录 前言 NCL插值脚本1 NCL插值脚本2 python格式转换脚本1 python 格式转换脚本2 前言 一般网页可视化风场中的数据都是json格式,而如果我们希望将wrf模式模拟输出的风场数据在网页中进行展示,这就需要先将wrfoutput数据转换为网页可以识别的json格式. 这里主要需要用到json库,主要的实现方式就是将读取的风场风量U,V转换为字典并存到json文件中 同时,由于wrf模拟的数据一般是非等间距的网格,需要先将数据进行插值,插值到等间距的网格,这里可以通过NCL的函

  • Python中使用json.load()和json.loads()加载json数据的方法实例

    目录 前言 预备知识: 使用方法 总结 前言 最近在python里面用json读取json文件,可是老是不成功,特此记录一下. 预备知识: def load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw): """Deserialize ``fp`` (a ``.read()``-suppor

  • 使用python解析json字段的3种方式实例

    目录 1.运用re.json.jsonpath包解析json思路 2.三种方式的json解析案例 (1)运用re正则表达式解析json (2)运用字典的数据结构性质解析json (3)运用jsonpath的路径解析json 3.附录:re正则表达式语法 附:python 处理非标准 json 格式字符串 总结 1.运用re.json.jsonpath包解析json思路 (1)re:正则表达式,通过json的形式对症下药,写表达式去解析json: (2)json: 通过json中的json.loa

  • python中Requests发送json格式的post请求方法

    目录 前言 1.普通string类型 2.string内是字典的 3.元组(嵌套列表或者) 4.字典 5.json 6.传入非嵌套元组或列表 7.以post(url,json=data)请求 前言 问题: 做requests请求时遇到如下报错: {“code”:“500”,“message”:"JSON parse error: Cannot construct instance of com.bang.erpapplication.domain.User (although at least

  • 如何利用Python解析超大的json数据(GB级别)

    使用Python解析各种格式的数据都很方便,比如json.txt.xml.csv等.用于处理简单的数据完全足够用了,而且代码简单易懂. 前段时间我遇到一个问题,如何解析超大的json文件呢?刚开始天真的我在使用json.load直接加载json文件,然而内存报错却给了我当头一棒,json.load它是直接将数据加载到内存中然后解析出来的,这说明什么呢?当你的json文件过于庞大的时候,你的电脑内存装不下你的json文件,这时候就相当尴尬了,加载不了,解析不了!! 怎么办呢?我赶紧上网查阅资料,网

  • 利用Python爬虫爬取金融期货数据的案例分析

    目录 任务简介 解决步骤 代码实现 总结 大家好 我是政胤今天教大家爬取金融期货数据 任务简介 首先,客户原需求是获取https://hq.smm.cn/copper网站上的价格数据(注:获取的是网站上的公开数据),如下图所示: 如果以该网站为目标,则需要解决的问题是“登录”用户,再将价格解析为表格进行输出即可.但是,实际上客户核心目标是获取“沪铜CU2206”的历史价格,虽然该网站也有提供数据,但是需要“会员”才可以访问,而会员需要氪金...... 数据的价值!!! 鉴于,客户需求仅仅是“沪铜

  • 利用Python第三方库xlwt写入数据到Excel工作表实例代码

    目录 1. 安装 xlwt 库 2. 使用 xlwt 库 2.1 向 Excel 工作表写入单个数据 2.2 向 Excel 工作表写入多个数据 2.3 向 Excel 工作表写入多个数据(进阶) 3. 总结 1. 安装 xlwt 库 Python 写入数据到 Excel 工作簿中可以使用第三方库 xlwt. xlwt 拆分下来看就是 excel 和 write 的简化拼接,意思就是写数据到 Excel. 这个第三方库的 pip 安装命令如下所示: pip install xlwt -i htt

  • 利用Python 爬取股票实时数据详情

    东方财富网地址如下: http://quote.eastmoney.com/center/gridlist.html#hs_a_board 我们通过点击该网站的下一页发现,网页内容有变化,但是网站的 URL 却不变,也就是说这里使用了 Ajax 技术,动态从服务器拉取数据,这种方式的好处是可以在不重新加载整幅网页的情况下更新部分数据,减轻网络负荷,加快页面加载速度. 我们通过 F12 来查看网络请求情况,可以很容易的发现,网页上的数据都是通过如下地址请求的 http://38.push2.eas

  • jQuery使用ajax方法解析返回的json数据功能示例

    本文实例讲述了jQuery使用ajax方法解析返回的json数据功能.分享给大家供大家参考,具体如下: 最近在用jQuery的ajax方法传递接收json数据时发现一个问题,那就是返回的data数据,有时候可以直接作为json数据使用,可有时候又不行.查了些资料,解释如下: $.ajax({ url: ajaxurl, type: "POST", success: function(data){ //假设返回的json数据里有status及info2个属性 //有时候可以直接ajaxo

  • 对python操作kafka写入json数据的简单demo分享

    如下所示: 安装kafka支持库pip install kafka-python from kafka import KafkaProducer import json ''' 生产者demo 向test_lyl2主题中循环写入10条json数据 注意事项:要写入json数据需加上value_serializer参数,如下代码 ''' producer = KafkaProducer( value_serializer=lambda v: json.dumps(v).encode('utf-8'

  • Python解析多帧dicom数据详解

    概述 pydicom是一个常用python DICOM parser.但是,没有提供解析多帧图的示例.本文结合相关函数和DICOM知识做一个简单说明. DICOM多帧数据存储 DICOM标准中关于多帧数据存储的最重要一部分说明是PS3.5 Annex A.4 A.4 Transfer Syntaxes For Encapsulation of Encoded Pixel Data. 无论何时,Pixel Data都存放在Pixel Data (7FE0,0010)中.有可能是直接存放的(nati

  • Python 解析简单的XML数据

    问题 你想从一个简单的XML文档中提取数据. 解决方案 可以使用 xml.etree.ElementTree 模块从简单的XML文档中提取数据.为了演示,假设你想解析Planet Python上的RSS源.下面是相应的代码: from urllib.request import urlopen from xml.etree.ElementTree import parse # Download the RSS feed and parse it u = urlopen('http://plane

  • 如何利用Python连接MySQL数据库实现数据储存

    目录 介绍 Python连接MySQL实现数据储存 总结 介绍 MySQL是一个关系型数据库,MySQL由于性能高.成本低.可靠性好,已经成为最流行的开源数据库.最开始由瑞典的MySQL AB公司开发,后来被甲骨文公司(Oracle)收购. 如何利用Python连接MySQL数据库实现数据储存,下面我们将着重介绍. Python连接MySQL实现数据储存 首先我们需要准备Python的pymysql模块,MySQL数据库(这个自行网上找教学安装),Navicat Premium 15数据库工具(

  • 使Ext的Template可以解析二层的json数据的方法

    Ext的Template支持通过传入json数据的方式进行模板替换. API中有这样一段示例: 复制代码 代码如下: var t = new Ext.Template(      '<div name="{id}">',          '<span class="{cls}">{name:trim} {value:ellipsis(10)}</span>',      '</div>'  );  t.append(

随机推荐