在使用Python解析一个超大的JSON文件时,如果JSON文件过大,直接将其内容全部加载至内存中进行JSON解析往往会因为内存不足而失败。

而ijson是具有标准Python迭代器接口的迭代JSON解析器,非常适用于解析超大的JSON文件。

安装

ijson作为一个Python的第三方库可以用Python标准的包管理工具进行安装:

  1. pip3 install ijson

QuickStart

我们将以如下json字符串为例来演示ijson相关的功能使用。

  1. {
  2. "earth": {
  3. "europe": [
  4. {"name": "Paris", "type": "city", "info": { ... }},
  5. {"name": "Thames", "type": "river", "info": { ... }},
  6. // ...
  7. ],
  8. "america": [
  9. {"name": "Texas", "type": "state", "info": { ... }},
  10. // ...
  11. ]
  12. }
  13. }

ijson最常用的方法是将数据流转为一个可迭代对象:

  1. import ijson
  2. f = urlopen('http://.../')
  3. objects = ijson.items(f, 'earth.europe.item')
  4. cities = (o for o in objects if o['type'] == 'city')
  5. for city in cities:
  6. do_something_with(city)

上述的例子是直接从一个url中读取数据进行解析的方式,如果想要从文件中解析JSON数字,使用方式如下:

  1. import ijson
  2. with open(mark_file, "r") as f:
  3. objects = ijson.items(f, 'earth.europe.item')
  4. cities = (o for o in objects if o['type'] == 'city')
  5. for city in cities:
  6. do_something_with(city)