1. ホーム
  2. python

[解決済み] 複数のJSONオブジェクトを含むJSONファイルの読み込みとパース

2022-03-14 03:05:34

質問

でJSONファイルを読み込み、パースしようとしています。 Python . しかし、ファイルを読み込もうとして行き詰っています。

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.2. json - 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"}

解決方法は?

あなたは JSON Lines形式のテキストファイル . ファイルを一行ずつパースする必要があります。

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度に1つのJSONオブジェクトを読み込むにはどうすればいいですか? を使用して、バッファードメソッドで個々のオブジェクトをパースします。