我使用以下函数来块化可迭代的python对象。
from itertools import islice
def chunked_iterable(iterable, chunk_size):
it = iter(iterable)
while True:
chunk = tuple(islice(it, chunk_size))
if not chunk:
break
yield chunk
我希望用基本的JSON文件做类似的事情。
[
{object1: 'object1'},
{object2: 'object2'},
{object3: 'object3'},
{object4: 'object4'},
{object5: 'object5'},
{object6: 'object6'},
etc...
]
喜欢这个。
from pathlib import Path
import json
def json_chunk(json_array_of_objects, object_count):
# What goes here?
if __name__ == '__main__':
with open(Path(__file__).parent / 'raw_data.json') as raw_data:
json_data = json.load(raw_data)
for json_array_with_five_objects in enumerate(json_chunk(json_data, 5)):
for object in json_array_with_five_objects:
print(object[0])
这个术语我在寻找“流式传输”JSON数据吗? 你如何流式传输JSON数据?
作为一项学习练习,我现在正试图坚持使用基本的python功能,但使用其他软件包的答案也很有帮助。
答案 0 :(得分:2)
经过进一步思考,使用object_hook
或object_pairs_hook
参数需要先将整个文件读入内存 - 所以为了避免这样做,而是在这里逐步读取文件,行逐线。
我必须修改你的示例JSON文件,使其成为有效的JSON(你的问题是Python字典)。请注意,此代码是特定于格式的,因为它假定数组中的每个JSON对象完全位于一行上 - 尽管可以根据需要将其更改为处理多行对象定义。
所以这是一个带有有效JSON内容的示例测试输入文件:
[
{"thing1": "object1"},
{"thing2": "object2"},
{"thing3": "object3"},
{"thing4": "object4"},
{"thing5": "object5"},
{"thing6": "object6"}
]
代码:
from itertools import zip_longest
import json
from pathlib import Path
def grouper(n, iterable, fillvalue=None):
""" s -> (s0, s1...sn-1), (sn, sn+1...s2n-1), (s2n, s2n+1...s3n-1), ... """
return zip_longest(*[iter(iterable)]*n, fillvalue=fillvalue)
def read_json_objects(fp):
""" Read objects from file containing an array of JSON objects. """
next(fp) # Skip first line.
for line in (line.strip() for line in fp):
if line[0] == ']': # Last line?
break
yield json.loads(line.rstrip(','))
def json_chunk(json_file_path, object_count):
with open(json_file_path) as fp:
for group in grouper(object_count, read_json_objects(fp)):
yield(tuple(obj for obj in group if obj is not None))
if __name__ == '__main__':
json_file_path = Path(__file__).parent / 'raw_data.json'
for array in json_chunk(json_file_path, 5):
print(array)
处理测试文件的输出:
({'thing1': 'object1'}, {'thing2': 'object2'}, {'thing3': 'object3'}, {'thing4': 'object4'}, {'thing5': 'object5'})
({'thing6': 'object6'},)
答案 1 :(得分:0)
JSON是一种完全独立于语言但使用的文本格式 C系列程序员熟悉的约定 语言,包括C,C ++,C#,Java,JavaScript,Perl,Python和 很多其他的。这些属性使JSON成为理想的数据交换 语言。 - https://www.json.org/
JSON是一串文字。您需要将其转换回python以进行迭代