Cargando un archivo con más de una línea de JSON en Pandas


92

Estoy tratando de leer en un archivo JSON en el marco de datos de Python pandas (0.14.0). Aquí está la primera línea del archivo 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"}

Estoy tratando de hacer lo siguiente: df = pd.read_json(path).

Recibo el siguiente error (con rastreo completo):

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

Cual es el Trailing dataerror? ¿Cómo lo leo en un marco de datos?

Siguiendo algunas sugerencias, aquí hay algunas líneas del archivo .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"}

Este archivo .json que estoy usando contiene un objeto JSON en cada línea según la especificación.

Probé la jsonlint.com página web como se sugiere y da el siguiente error:

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

1
Tiene datos adicionales en el archivo que no forman parte del objeto JSON.
Martijn Pieters

¿Cómo se ven las últimas líneas del archivo json?
Bryan Oakley

2
Este ejemplo se lee bien para mí en pandas 0.16.0. ¿Qué versión de pandas estás usando?
Andy Hayden

1
@ user62198 actualizado a 0.16.0, ha habido algunas correcciones en read_json.
Andy Hayden

1
@Cornel Ghiban, puedo cargar el archivo completo o leerlo en una línea individual. Parece que la conversión al formato que mencionaste puede ser un poco difícil, ya que hay más de 5 millones de registros de este tipo.
user62198

Respuestas:


240

Desde la versión 0.19.0 de Pandas puede usar el linesparámetro, así:

import pandas as pd

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

¿Alguna idea de cómo obtener una solución alternativa a este problema relevante para el linesargumento? github.com/pandas-dev/pandas/issues/15132
Chuck

33

Tienes que leerlo línea por línea. Por ejemplo, puede utilizar el siguiente código proporcionado por ryptophan en 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)

Hola, estoy tratando de leer un archivo json y almacenarlo en un marco de datos. Sin embargo, cuando usé su código, recibí un error: "TypeError: secuencia elemento 0: instancia str esperada, bytes encontrados". ¿Sabes qué tiene de malo?
ngoduyvu

3

El siguiente código me ayudó a cargar JSONcontenido en 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

Tuve un problema similar.

Resulta que pd.read_json(myfile.json)buscará en la carpeta principal automáticamente, pero devuelve este error de 'datos finales' si no está en la misma carpeta que el archivo.

Lo descubrí, porque cuando intenté hacerlo con open('myfile.json', 'r'), y me salió un FileNotFounderror, verifiqué las rutas.

No había podido mover myfile.json a la misma carpeta que mi cuaderno.

Cambiarlo a pd.read_json('../myfile.json')simplemente funcionó.


1
Es una tontería que dé un ValueError: Trailing datacuando debería dar un FileNotFound. Esto también me pasó a mí.
ProGirlXOXO
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.