Chargement d'un fichier avec plus d'une ligne de JSON dans Pandas


92

J'essaie de lire un fichier JSON dans un cadre de données Python pandas (0.14.0). Voici la première ligne du fichier JSON:

{"votes": {"funny": 0, "useful": 0, "cool": 0}, "user_id": "P_Mk0ygOilLJo4_WEvabAA", "review_id": "OeT5kgUOe3vcN7H6ImVmZQ", "stars": 3, "date": "2005-08-26", "text": "This is a pretty typical cafe.  The sandwiches and wraps are good but a little overpriced and the food items are the same.  The chicken caesar salad wrap is my favorite here but everything else is pretty much par for the course.", "type": "review", "business_id": "Jp9svt7sRT4zwdbzQ8KQmw"}

Je suis en train de procéder comme suit: df = pd.read_json(path).

J'obtiens l'erreur suivante (avec traçage complet):

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/d/anaconda/lib/python2.7/site-packages/pandas/io/json.py", line 198, in read_json
    date_unit).parse()
  File "/Users/d/anaconda/lib/python2.7/site-packages/pandas/io/json.py", line 266, in parse
    self._parse_no_numpy()
  File "/Users/d/anaconda/lib/python2.7/site-packages/pandas/io/json.py", line 483, in _parse_no_numpy
    loads(json, precise_float=self.precise_float), dtype=None)
ValueError: Trailing data

Quelle est l' Trailing dataerreur? Comment le lire dans un bloc de données?

Après quelques suggestions, voici quelques lignes du fichier .json:

{"votes": {"funny": 0, "useful": 0, "cool": 0}, "user_id": "P_Mk0ygOilLJo4_WEvabAA", "review_id": "OeT5kgUOe3vcN7H6ImVmZQ", "stars": 3, "date": "2005-08-26", "text": "This is a pretty typical cafe.  The sandwiches and wraps are good but a little overpriced and the food items are the same.  The chicken caesar salad wrap is my favorite here but everything else is pretty much par for the course.", "type": "review", "business_id": "Jp9svt7sRT4zwdbzQ8KQmw"}
{"votes": {"funny": 0, "useful": 0, "cool": 0}, "user_id": "TNJRTBrl0yjtpAACr1Bthg", "review_id": "qq3zF2dDUh3EjMDuKBqhEA", "stars": 3, "date": "2005-11-23", "text": "I agree with other reviewers - this is a pretty typical financial district cafe.  However, they have fantastic pies.  I ordered three pies for an office event (apple, pumpkin cheesecake, and pecan) - all were delicious, particularly the cheesecake.  The sucker weighed in about 4 pounds - no joke.\n\nNo surprises on the cafe side - great pies and cakes from the catering business.", "type": "review", "business_id": "Jp9svt7sRT4zwdbzQ8KQmw"}
{"votes": {"funny": 0, "useful": 0, "cool": 0}, "user_id": "H_mngeK3DmjlOu595zZMsA", "review_id": "i3eQTINJXe3WUmyIpvhE9w", "stars": 3, "date": "2005-11-23", "text": "Decent enough food, but very overpriced. Just a large soup is almost $5. Their specials are $6.50, and with an overpriced soda or juice, it's approaching $10. A bit much for a cafe lunch!", "type": "review", "business_id": "Jp9svt7sRT4zwdbzQ8KQmw"}

Ce fichier .json que j'utilise contient un objet JSON dans chaque ligne selon la spécification.

J'ai essayé le site Web jsonlint.com comme suggéré et cela donne l'erreur suivante:

Parse error on line 14:
...t7sRT4zwdbzQ8KQmw"}{    "votes": {
----------------------^
Expecting 'EOF', '}', ',', ']'

1
Vous avez des données supplémentaires dans le fichier qui ne font pas partie de l'objet JSON.
Martijn Pieters

À quoi ressemblent les dernières lignes du fichier json?
Bryan Oakley

2
Cet exemple se lit très bien pour moi dans pandas 0.16.0. Quelle version de pandas utilisez-vous?
Andy Hayden

1
@ user62198 mise à jour vers 0.16.0, il y a eu quelques correctifs pour read_json.
Andy Hayden

1
@Cornel Ghiban, je peux charger le fichier entier ou le lire sur une ligne individuelle. Il semble que la conversion dans le format que vous avez mentionné pourrait être un peu difficile car il y a plus de 5 millions de disques de ce type.
user62198

Réponses:


240

À partir de la version 0.19.0 de Pandas, vous pouvez utiliser le linesparamètre, comme ceci:

import pandas as pd

data = pd.read_json('/path/to/file.json', lines=True)

Une idée de la façon de résoudre ce problème en rapport avec l' linesargument? github.com/pandas-dev/pandas/issues/15132
Chuck

33

Vous devez le lire ligne par ligne. Par exemple, vous pouvez utiliser le code suivant fourni par ryptophan sur reddit :

import pandas as pd

# read the entire file into a python array
with open('your.json', 'rb') as f:
    data = f.readlines()

# remove the trailing "\n" from each line
data = map(lambda x: x.rstrip(), data)

# each element of 'data' is an individual JSON object.
# i want to convert it into an *array* of JSON objects
# which, in and of itself, is one large JSON object
# basically... add square brackets to the beginning
# and end, and have all the individual business JSON objects
# separated by a comma
data_json_str = "[" + ','.join(data) + "]"

# now, load it into pandas
data_df = pd.read_json(data_json_str)

Salut, j'essaie de lire un fichier json et de le stocker dans le dataframe. Cependant, lorsque j'ai utilisé votre code, j'ai eu une erreur: "TypeError: item de séquence 0: instance de str attendue, octets trouvés". Savez-vous ce qui ne va pas avec ça?
ngoduyvu

3

Le code suivant m'a aidé à charger du JSONcontenu dans un dataframe:

import json
import pandas as pd

with open('Appointment.json', encoding="utf8") as f:
    data = f.readlines()
    data = [json.loads(line) for line in data] #convert string to dict format
df = pd.read_json(data) # Load into dataframe

1

J'avais un problème similaire.

Il s'avère que pd.read_json(myfile.json)cela recherchera automatiquement dans le dossier parent, mais cela renvoie cette erreur de `` données de fin '' si vous n'êtes pas dans le même dossier que le fichier.

Je l'ai compris, parce que quand j'ai essayé de le faire avec open('myfile.json', 'r'), et que j'ai eu une FileNotFounderreur, j'ai vérifié les chemins.

Je n'avais pas réussi à déplacer myfile.json dans le même dossier que mon notebook.

Le changer pour pd.read_json('../myfile.json')juste a fonctionné.


1
C'est idiot qu'il donne un ValueError: Trailing dataquand il devrait donner un FileNotFound. Cela m'est également arrivé.
ProGirlXOXO
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.