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

j'essaie de charger et 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)

Donne:

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

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

77
demandé sur Martijn Pieters 2012-09-17 03:00:56

3 réponses

Vous avez un JSON Lignes de texte format de fichier . Vous devez analyser votre ligne de fichier par ligne:

import json

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

Chaque ligne contient JSON valide, mais dans l'ensemble, il n'est pas une valeur JSON comme il n'y a pas de haut-niveau de la liste ou de la définition de l'objet.

notez que parce que le fichier contient JSON par ligne, vous êtes sauvé les maux de tête d'essayer de tout analyser en une seule fois ou de comprendre un JSON en streaming analyseur. Vous pouvez désormais choisir de traiter chaque ligne séparément avant de passer à la suivante, d'économiser la mémoire dans le processus. Vous ne voulez probablement pas ajouter chaque résultat à une liste et puis traiter tout si votre fichier est vraiment grand.

si vous avez un fichier contenant des objets JSON individuels avec des délimiteurs entre les deux, utilisez Comment puis-je utiliser le module 'json' pour lire dans un objet JSON à la fois? pour analyser des objets individuels en utilisant une méthode tamponnée.

165
répondu Martijn Pieters 2017-05-23 11:47:23

que est mal formaté. Vous avez un objet JSON par ligne, mais ils ne sont pas contenus dans une structure de données plus grande (c'est-à-dire un tableau). Vous devrez soit le reformater de manière à ce qu'il commence par [ et se termine par ] avec une virgule à la fin de chaque ligne, ou l'analyser ligne par ligne comme dictionnaires séparés.

5
répondu Daniel Roseman 2012-09-16 23:09:16

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

2
répondu wouter bolsterlee 2017-07-17 18:00:11