访问文件中的多个词典 - Python

时间:2018-02-16 19:30:28

标签: json python-3.x dictionary stream

我对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来执行此操作。

我无法修改现有文件,因此请勿告诉我添加' [],','

其他帮助:

我可能会遇到无法直接存储在内存中的文件,因此解决方案更加偏见。

1 个答案:

答案 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])