127

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)

18.2jsonを見ました。— JSON エンコーダーとデコーダーは Python のドキュメントにありますが、この見苦しいドキュメントを読むのはかなり気が滅入ります。

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

{"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"}
4

4 に答える 4

267

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

import json

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

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

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

間に区切り文字を含む個々の JSON オブジェクトを含むファイルがある場合は、'json' モジュールを使用して一度に 1 つの JSON オブジェクトを読み込むにはどうすればよいですか? を使用してください。バッファリングされたメソッドを使用して個々のオブジェクトを解析します。

于 2012-09-16T23:08:23.347 に答える
3

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

于 2012-09-16T23:09:16.917 に答える