在python

时间:2017-09-16 16:58:33

标签: python json

每一行都是有效的JSON,但我需要整个文件才能成为有效的JSON。

我有一些数据是从Web服务聚合并转储到文件中的,因此它是JSON-eaque但不是有效的JSON,所以它不能以简单直观的方式处理JSON文件可以 - 从而构成一个主要的痛苦,它看起来(或多或少)像这样:

{"record":"value0","block":"0x79"} 
{"record":"value1","block":"0x80"} 

我一直试图将其重新解释为有效的JSON,我最近的尝试看起来像这样:

with open('toy.json') as inpt:
    lines = []
    for line in inpt:
        if line.startswith('{'):  # block starts
            lines.append(line) 

然而,正如你可以推断出我提出这个问题的事实 - 你做不了 - 关于我如何解决这个问题的任何想法?

修改

试过这个:

with open('toy_two.json', 'rb') as inpt:

    lines = [json.loads(line) for line in inpt] 

print(lines['record'])

但出现以下错误:

Traceback (most recent call last):
  File "json-ifier.py", line 38, in <module>
    print(lines['record'])
TypeError: list indices must be integers, not str

理想情况下,我希望能够使用普通的JSON与其进行交互,即data['value']

编辑II

with open('transactions000000000029.json', 'rb') as inpt:

    lines = [json.loads(line) for line in inpt]

    for line in lines: 
        records = [item['hash'] for item in lines]
    for item in records: 
        print item

2 个答案:

答案 0 :(得分:2)

每一行看起来都像一个有效的JSON文档。

这是“JSON Lines”格式(http://jsonlines.org/

尝试独立处理每一行(json.loads(line))或使用专门的库(https://jsonlines.readthedocs.io/en/latest/)。

def process(oneline):
    # do what you want with each line
    print(oneline['record'])

with open('toy_two.json', 'rb') as inpt:
    for line in inpt:
        process(json.loads(line))

答案 1 :(得分:2)

这看起来像我最近一直在使用的NDJSON。规范是here,我不确定它的用处。以下是否有效?

with open('the file.json', 'rb') as infile:
    data = infile.readlines()
    data = [json.loads(item.replace('\n', '')) for item in data] 

这应该会给你一个词典列表。