web-dev-qa-db-fra.com

Chargement et analyse d'un fichier JSON avec plusieurs objets JSON dans Python

J'essaie de charger et d'analyser un fichier JSON dans Python . Mais je suis coincé en essayant de charger le fichier:

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

Rendements:

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

J'ai regardé 18.2. json - codeur et décodeur JSON dans la documentation Python , mais il est assez décourageant de lire cette documentation horrible.

Premières lignes (anonymisées avec des entrées aléatoires):

{"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"}
92
Pi_

Vous avez un fichier texte au format JSON Lines . Vous devez analyser votre fichier ligne par ligne:

import json

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

Chaque ligne contient un code JSON valide, mais dans son ensemble, ce n'est pas une valeur JSON valide car il n'y a pas de liste de niveau supérieur ni de définition d'objet.

Notez que, le fichier contenant JSON par ligne, vous éviterez de tout analyser en une seule fois ou de trouver un analyseur JSON en streaming. Vous pouvez maintenant choisir de traiter chaque ligne séparément avant de passer à la suivante, en économisant de la mémoire. Vous ne voulez probablement pas ajouter chaque résultat à une liste et puis tout traiter si votre fichier est vraiment volumineux.

Si vous avez un fichier contenant des objets JSON individuels avec des délimiteurs entre-deux, utilisez Comment utiliser le module 'json' pour lire un objet JSON à la fois? pour analyser des objets individuels à l'aide d'une mémoire tampon méthode.

194
Martijn Pieters

pour ceux qui tombent sur cette question: la bibliothèque python jsonlines (beaucoup plus jeune que cette question) avec élégance. gère les fichiers avec un document JSON par ligne. voir https://jsonlines.readthedocs.io/

5
wouter bolsterlee

Ce est mal formaté. Vous avez un objet JSON par ligne, mais ils ne sont pas contenus dans une structure de données plus grande (un tableau). Vous devrez soit le reformater pour qu'il commence par [ et se termine par ] par une virgule à la fin de chaque ligne, ou soit analysé ligne par ligne sous forme de dictionnaires distincts.

5
Daniel Roseman