我试图使用ijson从json对象中检索元素。
json字符串位于文件中,该文件中唯一的内容是:
{"categoryTreeId":"0","categoryTreeVersion":"127","categoryAspects":[1,2,3]}(该字符串非常简化,但实际上长度超过2GB )
我需要帮助做以下工作:
1/打开该文件,
2/使用ijson将json数据加载到某个对象中。
3/从该对象检索列表"1,2,3“
为什么不使用以下简单代码:
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‘对象不可订阅
发布于 2022-05-26 01:56:14
这应该是可行的:
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函数创建一个列表,如下所示:
with open('your_file.json', 'b') as f:
numbers = list(ijson.items(f, 'categoryAspects.item'))请注意,如果有太多的数字,您仍然可能会耗尽内存,这就违背了进行流解析的目的。
EDIT2:使用list的另一种方法是创建一个包含所有数字的numpy数组,如果需要的话,它应该在内存中给出更紧凑的表示形式:
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
)https://stackoverflow.com/questions/72385776
复制相似问题