web-dev-qa-db-ja.com

Pythonの複数のJSONオブジェクトを含むJSONファイルの読み込みと解析

Python でJSONファイルをロードして解析しようとしています。しかし、私はファイルをロードしようとして立ち往生しています:

import json
json_data = open('file')
data = json.load(json_data)

利回り:

ValueError: Extra data: line 2 column 1 - line 225116 column 1 (char 232 - 160128774)

Pythonのドキュメントで18.2。json — JSONエンコーダーおよびデコーダーを見ましたが、きれいですこの恐ろしい外観のドキュメントを読むことを思いとどまらせる。

最初の数行(ランダム化されたエントリで匿名化):

{"votes": {"funny": 2, "useful": 5, "cool": 1}, "user_id": "harveydennis", "name": "Jasmine Graham", "url": "http://example.org/user_details?userid=harveydennis", "average_stars": 3.5, "review_count": 12, "type": "user"}
{"votes": {"funny": 1, "useful": 2, "cool": 4}, "user_id": "njohnson", "name": "Zachary Ballard", "url": "https://www.example.com/user_details?userid=njohnson", "average_stars": 3.5, "review_count": 12, "type": "user"}
{"votes": {"funny": 1, "useful": 0, "cool": 4}, "user_id": "david06", "name": "Jonathan George", "url": "https://example.com/user_details?userid=david06", "average_stars": 3.5, "review_count": 12, "type": "user"}
{"votes": {"funny": 6, "useful": 5, "cool": 0}, "user_id": "santiagoerika", "name": "Amanda Taylor", "url": "https://www.example.com/user_details?userid=santiagoerika", "average_stars": 3.5, "review_count": 12, "type": "user"}
{"votes": {"funny": 1, "useful": 8, "cool": 2}, "user_id": "rodriguezdennis", "name": "Jennifer Roach", "url": "http://www.example.com/user_details?userid=rodriguezdennis", "average_stars": 3.5, "review_count": 12, "type": "user"}
89
Pi_

JSON Lines形式のテキストファイル があります。ファイルを1行ずつ解析する必要があります。

import json

data = []
with open('file') as f:
    for line in f:
        data.append(json.loads(line))

lineには有効なJSONが含まれていますが、トップレベルのリストまたはオブジェクト定義がないため、全体として有効なJSON値ではありません。

ファイルには行ごとにJSONが含まれているため、一度にすべてを解析したり、ストリーミングJSONパーサーを見つけようとしたりするという頭痛の種が保存されることに注意してください。次の行に進む前に各行を個別に処理することを選択できるようになり、プロセスのメモリを節約できます。ファイルが本当に大きい場合、各結果を1つのリストに追加し、thenすべてを処理したくないでしょう。

間に区切り文字を持つ個々のJSONオブジェクトを含むファイルがある場合は、 「json」モジュールを使用して一度に1つのJSONオブジェクトを読み込む方法 を使用して、バッファー付きを使用して個々のオブジェクトを解析します方法。

189
Martijn Pieters

それはis不正な形式です。 1行に1つのJSONオブジェクトがありますが、より大きなデータ構造(配列など)には含まれていません。 [で始まり、]で終わるように各行の末尾にコンマを付けて再フォーマットするか、個別の辞書として1行ずつ解析する必要があります。

5
Daniel Roseman

この質問につまずいた人たちのために:python jsonlinesライブラリー(この質問よりもずっと若い)。 1行につき1つのjsonドキュメントでファイルを処理します。 https://jsonlines.readthedocs.io/ を参照してください

4