Python-大JSON文件读取-ijson

本文最后更新于:2020年11月17日 下午

信息

在学过一些Python的日常使用方法以后,你应该已经知道了Python自带的json库,它能处理一些json数据

例如:

1
2
json.loads()  # str读取
json.dumps() # 转为str

但在面对一个体量很大的 JSON 文件时,无论是写还是读都会非常吃力
专门用于处理大 JSON 的库是 ijson

ijson

Ijson是具有标准Python迭代器接口的迭代JSON解析器

链接

pypi: https://pypi.org/project/ijson/

使用

安装

1
pip install ijson

版本需求:3.5+

用法

说明中使用的json文件.json
1
2
3
4
5
6
7
8
9
10
11
12
13
{
"earth": {
"europe": [
{"name": "Paris", "type": "city", "info": { ... }},
{"name": "Thames", "type": "river", "info": { ... }},
// ...
],
"america": [
{"name": "Texas", "type": "state", "info": { ... }},
// ...
]
}
}

常用用法 ijson.items

最常见的用法:让ijsonJSON流中 获取前缀下的内容。并转换为Python对象

1
2
3
4
5
6
7
8
import ijson

f = open('file.json', 'r')
# 相当于获取json['earth']['europe']下的内容
objects = ijson.items(f, 'earth.europe.item')
cities = (o for o in objects if o['type'] == 'city')
for city in cities:
do_something_with(city)

只获取值 ijson.kvitems

如果你只需要values,而不需要key,可以用ijson.kvitems
这个函数的处理效率比ijson.items要高

1
2
3
4
5
6
7
import ijson

f = urlopen('http://.../')
european_places = ijson.kvitems(f, 'earth.europe.item')
names = (v for k, v in european_places if k == 'name')
for name in names:
do_something_with(name)

asyncio支持

方法也可以异步进行

1
2
3
4
5
6
7
8
9
import asyncio
import ijson

async def run():
f = await async_urlopen('http://..../')
async for object in ijson.items(f, 'earth.europe.item'):
if object['type'] == 'city':
do_something_with(city)
asyncio.run(run())

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!