JSON aus einer Datei lesen?

320

Ich bekomme ein bisschen Kopfschmerzen, nur weil eine einfach aussehende, einfache Aussage einige Fehler in mein Gesicht wirft.

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

"strings": [{"-name": "city", "#text": "City"}, {"-name": "phone", "#text": "Phone"}, ...,
            {"-name": "address", "#text": "Address"}]

Ich möchte die JSON-Datei lesen, genau das für jetzt. Ich habe diese Aussagen, die ich herausgefunden habe, 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 auf der Konsole angezeigte Fehler war folgender:

Traceback (most recent call last):
  File "/home/.../android/values/manipulate_json.py", line 5, in <module>
    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]

Bearbeitet

Geändert von json.loadszujson.load

und bekam das:

Traceback (most recent call last):
  File "/home/.../android/values/manipulate_json.py", line 5, in <module>
    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: line 829 column 1 - line 829 column 2 (char 18476 - 18477)
[Finished in 0.1s with exit code 1]
RRC
quelle
6
Sind Sie sicher, dass die Datei gültigen JSON enthält?
Explosion Pills
1
Mögliches Duplikat von Parsing-Werten aus einer JSON-Datei in Python
Pureferret
Siehe auch: Lese- und Schreibbeispiel für JSON
Martin Thoma
Ihre Datei hat ein ungültiges JSON-Format. Ändern Sie es zu: {"strings": [{"-name": "city", "#text": "City"}, {"-name": "phone", "#text": "Phone"}, ..., {"-name": "address", "#text": "Address"}]}
krizex

Antworten:

546

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)

Sie haben die json.loads()Methode verwendet , die nur für Zeichenfolgenargumente verwendet wird .

Bearbeiten: Die neue Nachricht ist ein ganz anderes Problem. In diesem Fall enthält diese Datei einen ungültigen JSON. Dafür würde ich empfehlen, die Datei über einen JSON-Validator auszuführen .

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

ubomb
quelle
2
hm ... Ich habe von json.loads zu json.load gewechselt, aber ich bekomme diese nette Nachricht.
RRC
5
Ah, die neue Nachricht ist ein ganz anderes Problem. In diesem Fall befindet sich in dieser Datei ein ungültiger JSON. Dafür würde ich empfehlen, die Datei über einen JSON-Validator auszuführen .
Ubomb
3
verstanden! In der Datei fehlte EOF. Die Datei wurde nicht korrekt beendet. Ich würde das nicht bemerken, wenn es nicht Ihre gute Empfehlung wäre! Vielen Dank!
RRC
1
ubomb, wenn du etwas ändern kannst, antworte mir, um es als akzeptiert zu markieren. Sei frei! Ich werde es markieren.
RRC
Ich muss die Datei mit dem Byte-Flag öffnen, dann kann ich die Methode json.load verwenden. Warum? Ich habe Py3.6
Grzegorz Krug
113

Hier ist eine Kopie des Codes, die für mich 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": {
        "Hello": "world"
    }
}

Möglicherweise möchten Sie Ihre Zeile json.load mit einem try catch abbrechen, da ungültiger JSON eine Stacktrace-Fehlermeldung verursacht.

user1876508
quelle
41

Das Problem ist die Verwendung mit Anweisung:

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

Die Datei wird implizit bereits geschlossen. Sie müssen nicht json_data.close()erneut anrufen .

Zongjun
quelle
1
Bitte entfernen Sie die Datei json_data.close (). Wie bereits erwähnt, wird es implizit aufgerufen.
Bonnie Varghese
1
@Zongjun: Bitte korrigieren Sie das Laden in json.load (json_data).
Knight71
2
print(json.dumps(d,sort_keys=True,indent=2))
Mike D
25

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

Aus Datei lesen und in JSON konvertieren

import json
from pprint import pprint

# Considering "json_list.json" is a json file

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

Mit Anweisung wird der geöffnete Dateideskriptor automatisch geschlossen.


Zeichenfolge zu JSON

import json
from pprint import pprint

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

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)
Drorhun
quelle
Als pd.read_json("strings.json").to_dict()
Diktat
0

Das funktioniert bei mir.

json.load () akzeptiert Dateiobjekte , analysiert die JSON-Daten, füllt ein Python-Wörterbuch mit den Daten und gibt sie an Sie zurück.

Angenommen, die JSON-Datei sieht folgendermaßen aus:

{
   "emp_details":[
                 {
                "emp_name":"John",
                "emp_emailId":"[email protected]"  
                  },
                {
                 "emp_name":"Aditya",
                 "emp_emailId":"[email protected]"
                }
              ] 
}

import json 

# Opening JSON file 
f = open('data.json',) 

# returns JSON object as  
# a dictionary 
data = json.load(f) 

# Iterating through the json 
# list 
for i in data['emp_details']: 
    print(i) 

# Closing file 
f.close()

#Output:
{'emp_name':'John','emp_emailId':'[email protected]'}
{'emp_name':'Aditya','emp_emailId':'[email protected]'}
Aditya patil
quelle