Seite 1 von 1

In Json Knoten erweitern durch Python

Verfasst: Samstag 6. Juni 2015, 17:55
von info61
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()

Re: In Json Knoten erweitern durch Python

Verfasst: Samstag 6. Juni 2015, 17:59
von 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()`.

Re: In Json Knoten erweitern durch Python

Verfasst: Samstag 6. Juni 2015, 18:12
von info61
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

Re: In Json Knoten erweitern durch Python

Verfasst: Samstag 6. Juni 2015, 18:44
von 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‽

Re: In Json Knoten erweitern durch Python

Verfasst: Samstag 6. Juni 2015, 19:40
von info61
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.

Re: In Json Knoten erweitern durch Python

Verfasst: Samstag 6. Juni 2015, 19:43
von 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.

Re: In Json Knoten erweitern durch Python

Verfasst: Samstag 6. Juni 2015, 23:26
von info61
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

Re: In Json Knoten erweitern durch Python

Verfasst: Sonntag 7. Juni 2015, 08:08
von Sirius3
@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".