2013-10-05 15 views
5

Ich benutze Python zum Löschen und Aktualisieren einer JSON-Datei, die aus den vom Benutzer bereitgestellten Daten generiert wird, so dass nur wenige Elemente in der Datenbank gespeichert werden sollten. Ich möchte ein bestimmtes Objekt aus der JSON-Datei löschen.Wie lösche ich Json-Objekt mit Python?

Meine JSON-Datei ist:

[ 
    { 
     "ename": "mark", 
     "url": "Lennon.com" 
    }, 
    { 
     "ename": "egg", 
     "url": "Lennon.com" 
    } 
] 

ich das JSON-Objekt mit enamemark löschen möchten.

Wie ich bin neu in Python Ich habe versucht, es zu löschen, indem Sie Objekte in dict Umwandlung, aber es funktioniert nicht. Gibt es einen anderen Weg, es zu tun? Ich habe versucht, dieses:

index=0 
while index < len(data): 
    next=index+1 
    if(data[index]['ename']==data[next]['ename']): 
     print "match found at" 
     print "line %d and %d" %(next,next+1) 
     del data[next] 
    index +=1 
+2

Können Sie uns den Code zeigen, den Sie ausprobiert haben? – RyPeck

+0

@RyPeck Ja, ich bearbeite meine Frage mit dem Code ich versuchte .. – arglee

+0

Wenn Sie dies ausführen, haben Sie das Problem, weil die Datei nicht geändert hat? – RyPeck

Antwort

11

Hier ist ein vollständiges Beispiel, das die JSON-Datei lädt, entfernt das Zielobjekt und gibt dann das aktualisierte JSON-Objekt in Datei.

#!/usr/bin/python                

# Load the JSON module and use it to load your JSON file.      
# I'm assuming that the JSON file contains a list of objects.     
import json 
obj = json.load(open("file.json")) 

# Iterate through the objects in the JSON and pop (remove)      
# the obj once we find it.              
for i in xrange(len(obj)): 
    if obj[i]["ename"] == "mark": 
     obj.pop(i) 
     break 

# Output the updated file with pretty JSON          
open("updated-file.json", "w").write(
    json.dumps(obj, sort_keys=True, indent=4, separators=(',', ': ')) 
) 

Der wichtigste Punkt ist, dass wir das Objekt durch Iterieren durch die Objekte in der geladenen Liste und dann Pop das Objekt aus der Liste zu finden, sobald wir es finden. Wenn Sie mehr als ein Objekt in der Liste entfernen müssen, sollten Sie die Indizes der Objekte, die Sie entfernen möchten, speichern und dann alle auf einmal entfernen, nachdem Sie das Ende der for-Schleife erreicht haben (was nicht der Fall ist) möchte die Liste ändern, während Sie es durchlaufen).

+0

seine nicht funktioniert. wenn ich es lief es nicht von der Marke aus der Liste – arglee

+1

Hmm Ich lief dieses Skript mit Ihrer genauen Eingabe und die Markierung wurde entfernt. Das Skript gibt eine neue Datei mit dem Namen "update-file.json" aus. Es wird also nicht die ursprüngliche Datei aktualisiert. Vielleicht ist das so? – mdml

+0

Ich habe den gleichen Code eingefügt, funktioniert aber immer noch nicht. Es produziert die gleiche Datei wie zuvor – arglee

0

Sie eine Liste haben es mit zwei Einträgen, die Wörterbücher sein passieren. Um den ersten zu entfernen, können Sie list.remove(item) oder list.pop(0) oder del list[0] verwenden.

http://docs.python.org/2/tutorial/datastructures.html#more-on-lists

+0

@lvo thanx aber list.remove (0) wird das erste Element aus der Liste entfernen. Ich möchte das ganze Objekt von dort löschen. – arglee

+0

@ user2511142 http://ideone.com/NlCTSp – Ivo

+0

Ja, aber es ist nicht hier zu arbeiten und Fehler zeigt, dass ‚Datei‘ nicht Gegenstand Löschen – arglee

0

Sie müssen das json Modul verwenden. Ich nehme python2 an. Versuchen Sie folgendes:

import json 
json_data = json.loads('<json_string>') 

for i in xrange(len(json_data)): 
    if(json_data[i]["id"] == "mark"): 
    del json_data[i] 
    break 
+2

Was passiert, wenn das Wörterbuch in einer * anderen * Position ist? –

+0

thanx @MartijnPieters aber ich habe es schon versucht .. das funktioniert nicht .. – arglee

+0

@MartijnPieters Messepunkt. Ich habe meine Antwort aktualisiert, um eine lineare Suche durchzuführen. – Nikhil

0

Ihre JSON-Datei enthält in einer Liste von Objekten, die Wörterbücher in Python sind. Ersetzen Sie einfach die Liste mit einer neuen, die nicht das Objekt in es hat:

import json 

with open('testdata.json', 'rb') as fp: 
    jsondata = json.load(fp) 

jsondata = [obj for obj in jsondata if obj['ename'] == 'mark'] 

print json.dumps(jsondata, indent=4) 
2

Der richtige Weg zu json ist es deserialisieren, ändern Sie die erstellten Objekte, und dann, wenn nötig, serialisiert sie zurück Json. Verwenden Sie dazu the json module. Kurz gesagt, verwenden Sie <deserialized object> = json.loads(<some json string>) zum Lesen von JSON und <json output> = json.dumps(<your object>), um JSON-Strings zu erstellen. In Ihrem Beispiel wäre das:

import json 
o = json.loads("""[ 
    { 
     "ename": "mark", 
     "url": "Lennon.com" 
    }, 
    { 
     "ename": "egg", 
     "url": "Lennon.com" 
    } 
]""") 
# kick out the unwanted item from the list 
o = filter(lambda x: x['ename']!="mark", o) 
output_string = json.dumps(o) 
+1

Wie kann es so einfach sein ?! Beste Antwort! – Minoru

Verwandte Themen