我对Json文件很新。我有一个带有多个json对象的json文件,如下所示:
{"ID":"12345","Timestamp":"20140101", "Usefulness":"Yes",
"Code":[{"event1":"A","result":"1"},…]}
{"ID":"1A35B","Timestamp":"20140102", "Usefulness":"No",
"Code":[{"event1":"B","result":"1"},…]}
{"ID":"AA356","Timestamp":"20140103", "Usefulness":"No",
"Code":[{"event1":"B","result":"0"},…]}
…
我想像流一样解析这些json对象。然而,对我来说,最终的游戏是创建event1和result的成对组合。像这样:
[AB,AB,BB],[11,10,10]
我所知道的: 字典的确切结构
我不知道:如何通过dict提取这些dict来执行此操作。
我无法修改现有文件,因此请勿告诉我添加' [],','
其他帮助:
我可能会遇到无法直接存储在内存中的文件,因此流解决方案更加偏见。
答案 0 :(得分:1)
最简单的方法就是将文件流提供给自定义生成器,这样就可以预先解析" json对象。这可以通过一些状态变量来完成,这些变量有点天真地计算open {
和[
的数量 - 每次它达到零时,它产生一个带有完整JSON对象的字符串。
我无法从您提供的示例中找出您想要的最终意图。我想你内部还有其他的代码"代码",你最终想要的是一对组合的" event1,结果"在每个"代码"最外层的价值。如果不是这样,请自行更改代码。
(有序的dict足以存储您需要的结果 - 如果需要,您可以检索键和值的单独列表)
from collections import OrderedDict
import json
import string
import sys
def char_streamer(stream):
for line in stream:
for char in line:
yield char
def json_source(stream):
result = []
curly_count = 0
bracket_count = 0
nonwhitespace_count = 0
inside_string = False
previous_is_escape = False
for char in char_streamer(stream):
if not result and char in string.whitespace:
continue
result.append(char)
if char == '"':
if inside_string:
inside_string = True
elif not previous_is_escape:
inside_string = False
if inside_string:
if char == "\\": # single '\' character
previous_is_escape = not previous_is_escape
else:
previous_is_escape = False
continue
if char == "{":
curly_count += 1
if char == "[":
bracket_count += 1
if char == "}":
curly_count -= 1
if char == "]":
bracket_count -= 1
if curly_count == 0 and bracket_count== 0 and result:
yield(json.loads("".join(result)))
result = []
def main(filename):
result = OrderedDict()
with open(filename) as file:
for data_part in json_source(file):
# agregate your data here
print (result.keys(), result.values())
main(sys.argv[1])