In Json Knoten erweitern durch Python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
info61
User
Beiträge: 5
Registriert: Samstag 6. Juni 2015, 17:34

Hallo,

ich hab das Problem, dass ich in meinem gespeicherten Json Datei nicht wie gewollt ein Knotenpunkt hinzufügen kann.

also mein Json sieht zurzeit so aus:

{
"Arbeitplan1": {
"1": { <-- (soll mein Knoten Nummer sein)
"Bezeichnung": "asd",
"Methode": "asd"
}
}
}

bist jetzt sollte es auch so abspeichern. Aber wenn ich nun noch ein Knotenpunkt dranhängen möchte unter meinem Arbeitplan1, dann wirds überschrieben.

sollte z.b nach weiteren Knotenpunkt Ergänzungen so aussehen:
{
"Arbeitplan1": {
"1": {
"Bezeichnung": "aaa",
"Methode": "sss"
},
"2": {
"Bezeichnung": "eee",
"Methode": "fff"
}
}
}

Mein python hinzufügen methode sieht so aus:

Code: Alles auswählen

def add(self, arbeitsplan1, eingabetext1, eingabetext2, counter):

		 data_o=open("./data/arbeitsvorgang.json","r")
		 liste_a=json.load(data_o)
		 data_o.close()

		arbeitsplan = arbeitsplan1
		
		neu ={arbeitsplan:{
				counter:{
					"Bezeichnung":eingabetext1,			
					"Methode": eingabetext2
				}
			}
		}
		liste_a.update(neu)	
			
		data_o = open("./data/arbeitsvorgang.json","w")
		json.dump(liste_a, data_o, indent = 2, sort_keys = True) 
		data_o.close()
	
		
add.exposed = True
ich hoffe ihr habt mich verstanden ich weiß schon garnicht mehr wie lange ich dran sitze.
ich habe diverse anderen sachen versucht hab es nicht hinbekommen.
Habe es auch mit append versucht aber leider...

Code: Alles auswählen

                data_o = open("./data/arbeitsvorgang.json","a") <--
		json.dump(liste_a, data_o, indent = 2, sort_keys = True) 
		data_o.close()
BlackJack

@info61: Du darfst den vorhandenen Arbeitsplan nicht mit dem `update()` überschreiben. Erstelle nicht eine komplette Datenstruktur sondern füge an der passenden Stelle in der vorhandenen einfach den neuen Datensatz hinzu. Mit einer Zuweisung und nicht mit `update()`.
info61
User
Beiträge: 5
Registriert: Samstag 6. Juni 2015, 17:34

speichert aber nicht so wie gewollt. wird immernoch überschrieben...

Code: Alles auswählen

def add(self, arbeitsplan1, eingabetext1, eingabetext2,counter):

		data_o=open("./data/arbeitsvorgang.json","r")
		liste_a=json.load(data_o)
		data_o.close()

		arbeitsplan = arbeitsplan1
		
	
		if (counter == '1'):
			neu ={
				arbeitsplan:{
					counter:{
						"Bezeichnung":eingabetext1,			
						"Methode": eingabetext2
					}
				}
			}
			liste_a.update(neu)	
			
		else:
			neu ={
				counter:{
					"Bezeichnung":eingabetext1,			
					"Methode":eingabetext2
				}
			}
			liste_a=neu	
				
		
		data_o = open("./data/arbeitsvorgang.json","w")
		json.dump(liste_a, data_o, indent = 2, sort_keys = True) 
		data_o.close()
		
	add.exposed = True
Zuletzt geändert von info61 am Samstag 6. Juni 2015, 19:38, insgesamt 1-mal geändert.
BlackJack

@info61: Du möchtest vielleicht mal das Tutorial aus der Python-Dokumentation durcharbeiten und Dich unter anderem mit Wörterbüchern (`dict`) vertraut machen.

Und lass mal so völlig sinnfreie Zuweisungen wie ``arbeitsplan = arbeitsplan1`` weg. Am besten sollten die Argumente schon keine Zahlen an den Namen haben. Was soll das‽
info61
User
Beiträge: 5
Registriert: Samstag 6. Juni 2015, 17:34

Hab schon nachgeguckt die Zuweisung geht so.

und die paar überflüssigen Zeilen kommen von testen anderer sachen.

Kann mir denn niemand helfen oder ein Tipp geben.
BlackJack

@info61: Du musst das Wörterbuch in das Du ein neues Schlüssel/Wert-Paar hinzufügen möchtest aus dem Wörterbuch das aus dem JSON erzeugt wird abfragen und dort dann dem Schlüssel den neuen Wert hinzufügen. Du hast da nur Zuweisungen von Werten an Namen im Code stehen.
info61
User
Beiträge: 5
Registriert: Samstag 6. Juni 2015, 17:34

Hab versucht das so zu machen. Nun kommt aber ein fehler im Terminal uzw.:

File "xxxxxxxx", line 39, in add
"Bezeichnung":counter[eingabetext1],
TypeError: string indices must be integers


Code: Alles auswählen

def add(self, arbeitsplan, eingabetext1, eingabetext2,counter):

		data_o=open("./data/arbeitsvorgang.json","r")
		liste_a=json.load(data_o)
		data_o.close()
	
	
		if (counter == '1'):
			neu ={
				arbeitsplan:{
					counter:{
						"Bezeichnung":eingabetext1,			
						"Methode": eingabetext2
					}
				}
			}
			liste_a.update(neu)	
			
		else:
			for key in liste_a:
				neu ={
				arbeitsplan:{
						counter:{
						"Bezeichnung":counter[eingabetext1],			<---------- line 39
						"Methode":counter[eingabetext2]
						}
					}
				}
			liste_a.update(neu)	

		data_o = open("./data/arbeitsvorgang.json","w")
		json.dump(liste_a, data_o, indent = 2) 
		data_o.close()
		
	add.exposed = True
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@info61: wild herumzuraten wird Dich nicht sehr weit bringen. Geh noch einmal einen Schritt zurück, und überlege Dir was Du machen willst, und welche Bedingungen dafür erfüllt sein müssen. Deine oberste Funktion heißt:
  • füge in Datei mit einem Arbeitsvorgang neuen Schritt ein
Jetzt mußt Du überlegen, wie Du diese komplexe Anweisung in einfachere herunterbrechen kannst:
  • lese Datei
  • hole aus oder erzeuge in Wörterbuch arbeitsplan
  • füge Schritt zu arbeitsplan hinzu
  • schreibe in Datei
Jetzt habe ich für Dich ja schon die meiste Arbeit erledigt, jetzt mußt Du nur noch die 4 Schritte implementieren. Dazu hilft es meist auch sprechende Variablennamen zu verwenden. Warum heißt eingabetext1 nicht bezeichnung und eingabetext2 nicht methode? liste_a ist ein ganz schlechter Name, weil erstens es keine Liste ist, zweitens der Typ nicht im Namen vorkommen sollte und der eigentliche Inhalt "arbeitsplaene" zu einem unverständlichen a verkrüppelt ist. Warum verwendest Du ein Wörterbuch mit einem Counter? Wäre da eine Liste nicht eine sinnvollere Datenstruktur? Und vergiß update. Wörterbücher ändert man per Zuweisung "abc[key] = value".
Antworten