2017-09-16 14 views
0

每一行都是有效的JSON,但是我需要將整個文件作爲有效的JSON。在python中創建有效的json對象

我有一些數據是從一個Web服務聚合並轉儲到一個文件,所以它是JSON-eaque,但不是有效的JSON,因此無法以簡單直觀的方式處理JSON文件 - 從而consituting一個重大的痛苦在脖子,它看起來像這樣(或多或少):

{"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 
+1

是否每行都有效JSON?例如:'行= [json.loads(line)inline in inpt]'做這項工作? –

+1

'lines.append(json.loads(line))'? –

+0

是的,但我不想處理每一行 - 我想整個處理文件 - 真實的文件有數百萬條記錄 –

回答

2

這看起來像我最近一直在使用的NDJSON。規範是here,我不確定它的用處。以下工作?

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

這應該給你一個詞典列表。

+0

當我剛剛嘗試出來我得到這個錯誤'print(data ['record']) TypeError:列表索引必須是整數,而不是str',我如何驗證這個工作? –

+0

因爲這會解析文件並給你一個字典列表,而不是字典。 – roganjosh

+0

但我想像json一樣與json進行交互,在普通json中,我可以調用像'data ['record']'你知道我的意思嗎? –

2

每一行看起來像一個有效的JSON文件。

這是 「JSON行」 格式(http://jsonlines.org/

嘗試independantly處理每行(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)) 
+0

我想整個處理文件 - 因爲真正的文件有數百萬條記錄 –

+0

那麼?您可以像在代碼中一樣迭代輸入文件的每一行,然後在'for'循環中應用json.loads(line)。 –

+0

聽起來很貴,我想要廉價而快速地做到這一點 –