首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ijson :如何使用ijson来检索dict/list元素(从文件还是从字符串)?

ijson :如何使用ijson来检索dict/list元素(从文件还是从字符串)?
EN

Stack Overflow用户
提问于 2022-05-26 01:38:52
回答 1查看 149关注 0票数 -1

我试图使用ijson从json对象中检索元素。

json字符串位于文件中,该文件中唯一的内容是:

代码语言:javascript
复制
{"categoryTreeId":"0","categoryTreeVersion":"127","categoryAspects":[1,2,3]}

(该字符串非常简化,但实际上长度超过2GB )

我需要帮助做以下工作:

1/打开该文件,

2/使用ijson将json数据加载到某个对象中。

3/从该对象检索列表"1,2,3“

为什么不使用以下简单代码:

代码语言:javascript
复制
my_json = json.loads('{"categoryTreeId":"0","categoryTreeVersion":"127","categoryAspects":[1,2,3]}')
my_list = my_json['categoryAspects']

那么,您必须想象这个"1,2,3“列表实际上超过2GB长,所以使用json.loads()将无法工作(它只会崩溃)。

我尝试了很多组合(很多次),它们都失败了,这里是我尝试过的一些例子

ij = ijson.items(fd,'') -> --这不会给出任何错误,下面的一个可以这样做

my_list = ijson.items(fd,'').next()

-> error = '_yajl2.items‘对象没有属性'next’

my_list = ijson.items(fd,'').items()

-> error = '_yajl2.items‘对象没有属性'items’

my_list =ij‘范畴’

-> error = '_yajl2.items‘对象不可订阅

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-26 01:56:14

这应该是可行的:

代码语言:javascript
复制
with open('your_file.json', 'b') as f:
    for n in ijson.items(f, 'categoryAspects.item'):
        print(n)

此外,如果您知道您的数字是某种“正常数字”,您还可以将use_float=True作为额外的参数传递给items以获得额外的速度(在上面的代码中是ijson.items(f, 'categoryAspects.item', use_float=True)) --在文档中有更多关于它的详细信息。

编辑:回答另一个问题:要获得一个包含所有数字的列表,您可以直接从items函数创建一个列表,如下所示:

代码语言:javascript
复制
with open('your_file.json', 'b') as f:
    numbers = list(ijson.items(f, 'categoryAspects.item'))

请注意,如果有太多的数字,您仍然可能会耗尽内存,这就违背了进行流解析的目的。

EDIT2:使用list的另一种方法是创建一个包含所有数字的numpy数组,如果需要的话,它应该在内存中给出更紧凑的表示形式:

代码语言:javascript
复制
with open('your_file.json', 'b') as f:
    numbers = numpy.fromiter(
                ijson.items(f, 'categoryAspects.item', use_float=True),
                dtype='float' # or int, if these are integers
              )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72385776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档