webentwicklung-frage-antwort-db.com.de

Python JSON-Datei lesen und ändern

Hallo, ich versuche, die Daten aus einer Json-Datei zu entnehmen und insert und id dann POST REST . Auszuführen. Meine Datei data.json hat:

{
    'name':'myname'
}

und ich möchte eine id hinzufügen, damit die json-daten wie folgt aussehen:

 {
     'id': 134,
     'name': 'myname'
 }

Also habe ich versucht:

import json
f = open("data.json","r")
data = f.read()
jsonObj = json.loads(data)

Ich kann die Json-Formatdatei nicht laden. Was muss ich tun, damit ich die Json-Datei in ein Json-Objekt konvertieren und einen anderen ID-Wert hinzufügen kann. 

30
codeBarer

Stellen Sie den Artikel mit data['id'] = ... ein.

import json

with open('data.json', 'r+') as f:
    data = json.load(f)
    data['id'] = 134 # <--- add `id` value.
    f.seek(0)        # <--- should reset file position to the beginning.
    json.dump(data, f, indent=4)
    f.truncate()     # remove remaining part
51
falsetru

die Lösung von falsetru ist Nizza, hat aber einen kleinen Fehler:

Nehmen Sie an, die ursprüngliche 'id' -Länge war größer als 5 Zeichen. Wenn wir dann mit der neuen 'id' ausgeben (134 mit nur 3 Zeichen), ist die Länge der Zeichenfolge, die von Position 0 in Datei geschrieben wird, kürzer als die ursprüngliche Länge. Zusätzliche Zeichen (z. B. '}') in der Datei aus dem ursprünglichen Inhalt.

Ich habe das gelöst, indem ich die Originaldatei ersetzt habe.

import json
import os

filename = 'data.json'
with open(filename, 'r') as f:
    data = json.load(f)
    data['id'] = 134 # <--- add `id` value.

os.remove(filename)
with open(filename, 'w') as f:
    json.dump(data, f, indent=4)
25
VadimBelov

Es gibt wirklich eine ganze Reihe von Möglichkeiten, und alle oben genannten sind auf die eine oder andere Weise gültig ... Lassen Sie mich einen einfachen Satz hinzufügen. Angenommen, Ihre derzeit vorhandene JSON-Datei sieht folgendermaßen aus:.

{
     "name":"myname"
}

Und Sie möchten diesen neuen JSON-Inhalt einbinden (Hinzufügen des Schlüssels "id")

{
     "id": "134",
     "name": "myname"
 }

Mein Ansatz war es immer, den Code mit leicht nachvollziehbarer Logik extrem lesbar zu halten. Zuerst lesen wir die gesamte vorhandene JSON-Datei in den Speicher, vorausgesetzt, Sie kennen die vorhandenen Schlüssel Ihres JSON sehr gut.

import json 

# first, get the absolute path to json file
PATH_TO_JSON = 'data.json' #  assuming same directory (but you can work your magic here with os.)

# read existing json to memory. you do this to preserve whatever existing data. 
with open(PATH_TO_JSON,'r') as jsonfile:
    json_content = json.load(jsonfile) # this is now in memory! you can use it outside 'open'

Als Nächstes verwenden wir wieder die Syntax 'with open ()' mit der Option 'w'. 'w' ist ein Schreibmodus, mit dem wir neue Informationen bearbeiten und in die Datei schreiben können. Hier ist der Haken, der bei uns funktioniert: Jeder vorhandene JSON mit demselben Zielschreibnamen wird automatisch gelöscht.

Jetzt können wir also einfach mit den neuen Daten in denselben Dateinamen schreiben

# add the id key-value pair (rmbr that it already has the "name" key value)
json_content["id"] = "134"

with open(PATH_TO_JSON,'w') as jsonfile:
    json.dump(json_content, jsonfile, indent=4) # you decide the indentation level

Und los geht's! data.json sollte gut für eine gute alte POST Anfrage sein

0
aaronlhe

Ich möchte eine modifizierte Version von Vadims Lösung vorstellen. Es hilft, mit asynchronen Anforderungen zum Schreiben/Ändern von Json-Dateien umzugehen. Ich weiß, dass es nicht Teil der ursprünglichen Frage war, aber für andere hilfreich sein könnte.

Im Falle einer asynchronen Dateiänderung erhöht os.remove(filename)FileNotFoundError, wenn Anforderungen häufig auftreten. Um dieses Problem zu umgehen, können Sie eine temporäre Datei mit geändertem Inhalt erstellen und diese gleichzeitig umbenennen und die alte Version ersetzen. Diese Lösung funktioniert sowohl für synchrone als auch für asynchrone Fälle.

import os, json, uuid

filename = 'data.json'
with open(filename, 'r') as f:
    data = json.load(f)
    data['id'] = 134 # <--- add `id` value.
    # add, remove, modify content

# create randomly named temporary file to avoid 
# interference with other thread/asynchronous request
tempfile = os.path.join(os.path.dirname(filename), str(uuid.uuid4()))
with open(tempfile, 'w') as f:
    json.dump(data, f, indent=4)

# rename temporary file replacing old file
os.rename(tempfile, filename)
0
Vadym Pasko