Laden einer Datei mit mehr als einer Zeile JSON in Pandas

90

Ich versuche, eine JSON-Datei in den Datenrahmen von Python Pandas (0.14.0) einzulesen. Hier ist die erste Zeile der JSON-Datei:

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

Ich versuche Folgendes zu tun : df = pd.read_json(path).

Ich erhalte die folgende Fehlermeldung (mit vollständigem Traceback):

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

Was ist der Trailing dataFehler? Wie lese ich es in einen Datenrahmen?

Nach einigen Vorschlägen finden Sie hier einige Zeilen der .json-Datei:

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

Diese von mir verwendete JSON-Datei enthält ein JSON-Objekt in jeder Zeile gemäß der Spezifikation.

Ich habe die Website jsonlint.com wie vorgeschlagen ausprobiert und es wird der folgende Fehler angezeigt :

Parse error on line 14:
...t7sRT4zwdbzQ8KQmw"}{    "votes": {
----------------------^
Expecting 'EOF', '}', ',', ']'
user62198
quelle
1
Sie haben zusätzliche Daten in der Datei, die nicht Teil des JSON-Objekts sind.
Martijn Pieters
Wie sehen die letzten Zeilen der JSON-Datei aus?
Bryan Oakley
2
Dieses Beispiel liest sich gut für mich in Pandas 0.16.0. Welche Version von Pandas benutzt du?
Andy Hayden
1
@ user62198 Update auf 0.16.0, es gab einige Korrekturen für read_json.
Andy Hayden
1
@Cornel Ghiban, ich kann die ganze Datei laden oder in einer einzelnen Zeile lesen. Die Konvertierung in das von Ihnen erwähnte Format scheint etwas schwierig zu sein, da es über 5 Millionen solcher Datensätze gibt.
user62198

Antworten:

237

Ab Version 0.19.0 von Pandas können Sie den linesParameter wie folgt verwenden :

import pandas as pd

data = pd.read_json('/path/to/file.json', lines=True)
Andrew
quelle
Haben Sie eine Idee, wie Sie eine für das linesArgument relevante Problemumgehung für dieses Problem finden können ? github.com/pandas-dev/pandas/issues/15132
Chuck
33

Sie müssen es Zeile für Zeile lesen. Beispielsweise können Sie den folgenden von ryptophan auf reddit bereitgestellten Code verwenden :

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)
Artem
quelle
Hallo, ich versuche, eine JSON-Datei zu lesen und im Datenrahmen zu speichern. Als ich jedoch Ihren Code verwendete, wurde folgende Fehlermeldung angezeigt: "TypeError: Sequenzelement 0: erwartete str-Instanz, gefundene Bytes". Weißt du was daran falsch ist?
Ngoduyvu
3

Der folgende Code hat mir geholfen, JSONInhalte in a zu laden 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
Triguna
quelle
1

Ich hatte ein ähnliches Problem.

Es stellt sich heraus, dass pd.read_json(myfile.json)die Suche im übergeordneten Ordner automatisch erfolgt, aber dieser Fehler "Nachlaufende Daten" zurückgegeben wird, wenn Sie sich nicht im selben Ordner wie die Datei befinden.

Ich habe es herausgefunden, denn als ich es versuchte, open('myfile.json', 'r')bekam ich einen FileNotFoundFehler und überprüfte die Pfade.

Ich konnte myfile.json nicht in denselben Ordner wie mein Notizbuch verschieben.

Das Ändern auf pd.read_json('../myfile.json')einfach funktioniert.

szeitlin
quelle
1
Es ist albern, dass es ein gibt, ValueError: Trailing datawann es ein geben sollte FileNotFound. Das ist mir auch passiert.
ProGirlXOXO