Ładowanie i analizowanie pliku JSON z wieloma obiektami JSON

Próbuję załadować i przeanalizować plik JSON w Pythonie . Ale utknąłem próbując załadować plik:

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)

Spojrzałem na 18.2. json - koder i dekoder JSON w dokumentacji Pythona, ale to dość zniechęcające, aby przeczytać tę okropnie wyglądającą dokumentację.

Pierwsze wiersze (anonimowe z losowymi wpisami):

{"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"}
Author: martineau, 2012-09-16

3 answers

Masz Plik tekstowy w formacie JSON . Musisz przetworzyć plik linia po linii:

import json

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

Każda linia zawiera poprawny JSON, ale jako całość nie jest poprawną wartością JSON, ponieważ nie ma listy najwyższego poziomu ani definicji obiektu.

Zauważ, że ponieważ plik zawiera JSON w wierszu, są zapisywane bóle głowy próbując przeanalizować to wszystko za jednym zamachem lub dowiedzieć się strumieniowego parsera JSON. Możesz teraz zdecydować się na przetwarzanie każdej linii osobno przed przejściem do następnie zapisywanie pamięci w procesie. Prawdopodobnie nie chcesz dodawać każdego wyniku do jednej listy i Następnie przetworzyć wszystko, jeśli Twój plik jest naprawdę duży.

Jeśli Masz plik zawierający poszczególne obiekty JSON z ogranicznikami pomiędzy nimi, użyj Jak używać modułu 'json' do odczytu w jednym obiekcie JSON na raz? do parsowania poszczególnych obiektów przy użyciu metody buforowanej.

 237
Author: Martijn Pieters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:23

Dla tych, którzy natknęli się na to pytanie: biblioteka Pythona jsonlines (znacznie młodsza od tego pytania) elegancko obsługuje pliki z jednym dokumentem json na wiersz. zobacz https://jsonlines.readthedocs.io/

 13
Author: wouter bolsterlee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-08 17:26:20

To jest źle sformatowane. Masz jeden obiekt JSON na linię, ale nie są one zawarte w większej strukturze danych(tj. tablicy). Musisz sformatować go tak, aby zaczynał się od [ i kończył się na ] przecinkiem na końcu każdej linii, lub przetworzyć wiersz po wierszu jako osobne słowniki.

 3
Author: Daniel Roseman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-16 23:09:16