619 Stimmen

Das Lesen von JSON aus einer Datei

Ein einfach aussehender, einfacher Satz wirft mir einige Fehler ins Gesicht.

Ich habe eine JSON-Datei namens strings.json wie diese:

"strings": [{"-name": "city", "#text": "Stadt"}, {"-name": "phone", "#text": "Telefon"}, ...,
            {"-name": "address", "#text": "Adresse"}]

Ich will die JSON-Datei lesen, nur das im Moment. Ich habe diese Aussagen gefunden, aber es funktioniert nicht:

import json
from pprint import pprint

with open('strings.json') as json_data:
    d = json.loads(json_data)
    json_data.close()
    pprint(d)

Der Fehler, der in der Konsole angezeigt wurde, war dieser:

Traceback (most recent call last):
  File "/home/.../android/values/manipulate_json.py", line 5, in 
    d = json.loads(json_data)
  File "/usr/lib/python2.7/json/__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: expected string or buffer
[Finished in 0.1s with exit code 1]

Wenn ich json.load anstelle von json.loads verwende, erhalte ich diesen Fehler:

Traceback (most recent call last):
  File "/home/.../android/values/manipulate_json.py", line 5, in 
    d = json.load(json_data)
  File "/usr/lib/python2.7/json/__init__.py", line 278, in load
    **kw)
  File "/usr/lib/python2.7/json/__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 369, in decode
    raise ValueError(errmsg("Extra data", s, end, len(s)))
ValueError: Extra data: Zeile 829 Spalte 1 - Zeile 829 Spalte 2 (Zeichen 18476 - 18477)
[Finished in 0.1s with exit code 1]

996voto

ubomb Punkte 8468

Die json.load() Methode (ohne "s" in "load") kann eine Datei direkt lesen:

import json

with open('strings.json') as f:
    d = json.load(f)
    print(d)

Du hast die json.loads() Methode verwendet, die nur für string Argumente benutzt wird.


Der Fehler den du bei json.loads bekommst, ist ein völlig anderes Problem. In diesem Fall gibt es einige ungültige JSON-Inhalte in dieser Datei. Dafür würde ich empfehlen, die Datei durch einen JSON-Validator laufen zu lassen.

Es gibt auch Lösungen zum Beheben von JSON, wie zum Beispiel Wie repariere ich automatisch eine ungültige JSON-Zeichenkette?.

131voto

user1876508 Punkte 12542

Hier ist eine Kopie des Codes, der bei mir gut funktioniert:

import json

with open("test.json") as json_file:
    json_data = json.load(json_file)
    print(json_data)

mit den Daten

{
    "a": [1,3,"asdf",true],
    "b": {
        "Hallo": "Welt"
    }
}

Sie möchten möglicherweise Ihre json.load-Zeile mit einem try catch umwickeln, da ungültiges JSON eine Stapelüberlauffehlermeldung verursachen wird.

53voto

Zongjun Punkte 627

Das Problem liegt in der Verwendung der with Anweisung:

with open('strings.json') as json_data:
    d = json.load(json_data)
    pprint(d)

Die Datei wird bereits implizit geschlossen. Es ist nicht erforderlich, json_data.close() erneut aufzurufen.

52voto

Thejesh PR Punkte 855

In Python 3 können wir die untenstehende Methode verwenden.

Aus einer Datei lesen und in JSON konvertieren

import json
from pprint import pprint

# Angenommen, "json_list.json" ist eine JSON-Datei

with open('json_list.json') as fd:
     json_data = json.load(fd)
     pprint(json_data)

Die with-Anweisung schließt automatisch den geöffneten Dateideskriptor.


String in JSON umwandeln

import json
from pprint import pprint

json_data = json.loads('{"name" : "myName", "age":24}')
pprint(json_data)

4voto

drorhun Punkte 405

Sie können die Pandas-Bibliothek verwenden, um die JSON-Datei zu lesen.

import pandas as pd
df = pd.read_json('strings.json', lines=True)
print(df)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X