Variablen in externer Datei speichern und abrufen.

Hey, vielen Dank für die Tips und Hinweise.
Das Einlesen funktioniert jetzt einwandfrei.
Beim Schreiben ergibt sich jedoch jetzt ein Problem:
Hier der Code mit den ausschlaggebenden Elementen:
Python:
abbaufaktortemp = open("saves_abbaufaktor", "r+")
saveabbaufaktor = abbaufaktortemp.readlines()

abbaufaktorpreistemp = open("saves_abbaufaktorpreis", "r+")
saveabbaufaktorpreis = abbaufaktorpreistemp.readlines()

abbaufaktor = float(json.loads(saveabbaufaktor[0]))
abbaufaktorpreis = float(json.loads(saveabbaufaktorpreis[0]))

while True:
    if Bedingung:
        abbaufaktor = abbaufaktor * 0.8
        abbaufaktorpreis = abbaufaktorpreis * 1.5
   
        abbaufaktor = str(abbaufaktor)
        abbaufaktorpreis = str(abbaufaktorpreis)
   
        abbaufaktortemp.writelines(abbaufaktor)
        abbaufaktorpreistemp.writelines(abbaufaktorpreis)
   
        abbaufaktor = float(abbaufaktor)
        abbaufaktorpreis = float(abbaufaktorpreis)

Der Teil über der Schleife dient zum Deklarieren und Einlesen, wollte ihn aber trotzdem zur Vollständigkeit dabei haben.
Kurz mein Vorhaben in der Schleife erklärt:

abbaufaktor = abbaufaktor * 0.8
abbaufaktorpreis = abbaufaktorpreis * 1.5
Erklärt sich glaube ich von selbst.

abbaufaktor = str(abbaufaktor)
abbaufaktorpreis = str(abbaufaktorpreis)
Die Zahl (Float) wird zu einem String, sonst gibt es Probleme beim Speicher (Schreiben) in eine Datei.

abbaufaktortemp.writelines(abbaufaktor)
abbaufaktorpreistemp.writelines(abbaufaktorpreis)
Jetzt das Wichtige: Hier sollen die Werte abbaufaktor und abbaufaktorpreis in die Datei gespeichert werden, die für abbaufaktortemp und abbaufaktorpreistemp hinterlegt ist.

abbaufaktor = float(abbaufaktor)
abbaufaktorpreis = float(abbaufaktorpreis)
Hier wird der Werte wieder in eine Zahl umgewandelt, da sonst damit nicht in der laufenden Sitzung gearbeitet werden kann.

Das Ganze funktioniert so jedoch nicht. Die Werte in den Dateien werden nicht überschrieben. Es kommt auch kein Error. Es steht immer noch der gleiche Wert in der Datei wie sonst auch, nicht der Neue abbaufaktor und abbaufaktorpreis.
Kann mir da wer weiterhelfen?
 
Wenn ich deinen Code so ausführe, wird bei mir ein neuer Wert geschrieben. Allerdings unter den alten Wert.
Wenn vorher nur eine 1.0 war, steht jetzt 1.0 und dann in der neuen Zeile die 0.8 da.
Das liegt am "r+". Ich würde die Datei lesen, schließen und dann später beim schreiben mit "w" öffnen.
Der Grund wieso bei dir nichts passiert, ist wohl weil deine if Bedingung nicht erfüllt ist (das hab ich zum Testen weggelassen).
 
Die if-Bedinung wird erfüllt. Ich hab, weil ich mich das auch gefragt habe, mal testweise print("123") reingeschrieben und mir wurde auch 123 angezeigt.
Ich dachte r+ steht für Lesen und Schreiben.
Ich denke mal ich werde die Datei, nachdem die Werte am Anfang eingelesen wurden, schließen und dann mit "w" öffnen (Das Ganze vor der while-Schleife). Mal schauen was passiert.
 
"r+" steht auch für lesen und schreiben, allerdings wird (wahrscheinlich wegen dem readlines) ans Ende der Datei geschrieben.
Da du aber überschreiben möchtest und auch nur einen Wert hast, bietet sich "w" mehr an.
Und die Datei bitte erst mit "w" öffnen wenn du wirklich schreiben willst, nicht vor der while.
Du hast ja vorher schon gemerkt, dass der Inhalt dabei gelöscht wird.
 
Ok. Jetzt ist die Datei einfach leer.
Habs mit .writelines(abc) und mit .write(abc) probiert.

Python:
abbaufaktortemp = open("saves_abbaufaktor", "r+")
saveabbaufaktor = abbaufaktortemp.readlines()

abbaufaktorpreistemp = open("saves_abbaufaktorpreis", "r+")
saveabbaufaktorpreis = abbaufaktorpreistemp.readlines()

abbaufaktor = float(json.loads(saveabbaufaktor[0]))
abbaufaktorpreis = float(json.loads(saveabbaufaktorpreis[0]))

abbaufaktortemp.close()
abbaufaktorpreistemp.close()
abbaufaktortemp = open("saves_abbaufaktor", "w")
abbaufaktorpreistemp = open("saves_abbaufaktorpreis", "w")

while True:
    if Bedingung:
        abbaufaktor = abbaufaktor * 0.8
        abbaufaktorpreis = abbaufaktorpreis * 1.5
        abbaufaktor = str(abbaufaktor)
        abbaufaktorpreis = str(abbaufaktorpreis)
        abbaufaktortemp.writelines(abbaufaktor)
        abbaufaktorpreistemp.writelines(abbaufaktorpreis)
        abbaufaktor = float(abbaufaktor)
        abbaufaktorpreis = float(abbaufaktorpreis)
Ergänzung ()

Ave Maria!
Funktioniert, wenn man das ganze in die while-Schleife reinpackt, wie du es gesagt hast :)
 
Ganz nebenbei, die folgenden Zeilen kannst du auch kürzen:
Code:
abbaufaktor = str(abbaufaktor)
abbaufaktorpreis = str(abbaufaktorpreis)
abbaufaktortemp.writelines(abbaufaktor)
abbaufaktorpreistemp.writelines(abbaufaktorpreis)
abbaufaktor = float(abbaufaktor)
abbaufaktorpreis = float(abbaufaktorpreis)
und zwar zu:
Python:
abbaufaktortemp.writelines(str(abbaufaktor))
abbaufaktorpreistemp.writelines(str(abbaufaktorpreis))
Die Werte werden nur beim Schreiben in einen String umgewandelt, außerhalb bleiben sie ein float :)
 
Hey, bin jetzt schlussendlich beim Speichern von der Liste angekommen.
Dabei passiert immer folgendes:
Ich wandle die List in ein String um. Das ganze schaut dann zum Beispiel so aus:

String: ['Apfel', 'Banane', 'Banane']
Das Ganze wird dann in der Datei gespeichert.
Beim Abrufen gibt es dann jedoch ein Problem:
Code:
Traceback (most recent call last):
  File "XXX.py", line 40, in <module>
    inventar = json.loads(saveinventar[0])
  File "C:\Python37\lib\json\__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "C:\Python37\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Python37\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 2 (char 1)
Beim Einlesen sind die Anführungszeichen störend. Nämlich genau diese hier: '
Python nutzt, wenn die Liste zu einem String konvertiert wird, automatisch ' und nicht " .
Änder ich das Ganze manuell in der Save-Datei (mach ich also aus jedem ' ein " ) funktioniert es einwandfrei.

Könnt ihr mir da helfen?
Ich habe schon folgendes probiert:
Python:
inventar = str(inventar)
inventar.replace("'", '"')
Das ändert jedoch nichts. Hier nochmal das was in der Klammer steht als Screenshot:
AZ: Anführungszeichen da die Methode einen String erwartet.
temp1.png

Jedoch wird beim Ausführen in der Datei nichts verändert.
Ich hab gelesen, dass wenn zwischen dem, was geändert werden soll und dem, was anstelle verwendet werden soll, kein Unterschied besteht, der alte String einfach bestehen bleibt.
Und obwohl für uns ein Unterschied zwischen ' und " besteht, könnte Python ja möglichweise keinen Unterschied darin sehen.
 
Das Problem ist deine Umwandlung der Liste in den String bzw. das was du speicherst.
Die Liste musst du nicht in einen String umwandeln um sie zu speichern, sonst wäre JSON ja nicht so nützlich :D
Python:
liste = ["Apfel", 'Birne', "Birne"] #Beispielliste
data = open("data", "w") #Öffne die Datei zum Schreiben
json.dump(liste, data) #Schreib den Listeninhalt in die Datei (ohne Umwandlungen)
Das sollte eigentlich komplett ausreichen. Und nebenbei, Python sieht da definitiv was anderes, da es ja nicht wie wir Zeichen sieht, sondern Bits/Bytes.
Ich glaube JSON erwartet für einen String immer die " damit es überall gleich ist.
 
Hat wunderbar funktioniert. Damit bin ich am Ende des Kapitels "Speichern in externe Datei" angekommen. Sollte ich auf weitere Probleme ohne verständliche Lösung im Internet stoßen, werde ich einen neuen Thread eröffnen. Ich möchte mich recht herzlich bedanken bei jedem, der mir geholfen hat. Vor allem bei dir, @davisx2 , dass du so viel Zeit für mich investiert hast. Mal schauen, was als nächstes auf uns zu kommt.
 
Spedex schrieb:
Aktuell hat die Datei keine Endung. Was für eine Endung es hat ist mir ziemlich egal, allerdings denke ich mal braucht man bei .xml oder .json eine gewisse Syntex, welche ich nicht beherrsche.

JSON sind einfach nur JavaScript Objects (JSON = JavaScript Object Notation). Im prinzip nicht sehr viel anders als ein Python Dictionary. Kann man auf jeden Fall gut mit Arbeiten wenn man Daten persistieren möchte und nicht direkt eine Datenbank nutzen will.
 
Zurück
Oben