Variablen in externer Datei speichern und abrufen.

Wenn ich das gerade richtig verstehe, müsste es eigentlich ausreichen, den Code wie in meinem angepassten Code deines Beispiels zu benutzen:
Python:
saveinventar = invtemp.readlines() #die ganze datei einlesen
inventar = json.loads(saveinventar[0]) #erste zeile
mehrZeug = json.loads(saveinventar[1]) #zweite zeile usw.
Das "Problem" mit dem readlines ist, dass eine Liste von Strings zurückkommt, weswegen JSON abstürzt.
Oder geht es um das Schreiben von Werten?
 
Wunderbar. Jetzt zum Schreiben. Ich habe den Modus auf r+ geändert.
Das ganze sieht jetzt so aus:
Python:
varstemp = open("saves_donotdelete", "r+")
Wenn ich folgendes verwende, kommt ein Error:
varstemp.writelines()
Kannst du mir da weiterhelfen?
 
Dafür müsste ich wissen, welcher Fehler es genau ist und was du dem writelines übergibst (oder ein Beispiel wie es aussehen kann)
 
Python:
varstemp = open("saves_donotdelete", "r+")
savedatei = varstemp.readlines()
savedateiwrite = varstemp.writelines()
inventar = []
inventartemp = open("saves_donotdelete_inv", "r+")
inventar = json.loads(inventartemp.readlines()[0])

punkte = int(json.loads(savedatei[1]))
absatz = "\n"
#Wird für .join Funktion benötigt
print ()
print ("Aktuell hast du " + str(punkte)  + " Punkte")
print()

if len(inventar) < 20:
    print ("Du hast aktuell folgende Elemente im Inventar:")
    print (absatz.join(inventar))
print ()
print ("Was möchtest du tun?")
auswahlm = "XXX"
print (auswahlm)
abbaufaktor = int(json.loads(savedatei[4]))
abbaufaktorpreis = int(json.loads(savedatei[7]))
einschmelzfaktor = int(json.loads(savedatei[10]))
einschmelzfaktorpreis = int(json.loads(savedatei[13]))
zermahlfaktor = int(json.loads(savedatei[16]))
zermahlfaktorpreis = int(json.loads(savedatei[19]))
baufaktor = int(json.loads(savedatei[22]))
baufaktorpreis = int(json.loads(savedatei[25]))


while True:
    aktion = input()
    aktion = aktion.title()
    if aktion == "I":
        os.system("cls")
        print ("Du hast aktuell folgende Elemente im Inventar:")
        print (absatz.join(inventar))
        print (auswahlm)
        punkte = punkte +10000
        punkte = int(json.loads(savedatei[1]))

Das wären fast vollständig die ersten Zeilen.
Hier das wichtige:
Python:
varstemp = open("saves_donotdelete", "r+")
savedatei = varstemp.readlines()
savedateiwrite = varstemp.writelines()
inventar = []
inventartemp = open("saves_donotdelete_inv", "r+")
inventar = json.loads(inventartemp.readlines()[0])

punkte = int(json.loads(savedatei[1]))


print ("Aktuell hast du " + str(punkte)  + " Punkte")


while True:
    aktion = input()
    aktion = aktion.title()
    if aktion == "I":
        punkte = punkte +10000
        punkte = int(json.loads(savedatei[1]))

Das ganze ist jetzt nur ein vereinfachtes Beispiel. Wenn "I" eingegeben wird, soll zu den Punkten 1000 hinzugefügt werden. Der neue Punktestand soll dann gespeichert werden.

Bin mir natürlich sicher, dass man so nicht Werte speichert. Aber ich weiß ja nicht wie.
So wie ich es aktuell habe, kommt folgende Fehlermeldung:
Code:
Traceback (most recent call last):
  File "XXX.py", line 12, in <module>
    savedateiwrite = varstemp.writelines()
TypeError: writelines() takes exactly one argument (0 given)


------------------
(program exited with code: 1)

Drücken Sie eine beliebige Taste . . .
 
Ah jetzt verstehe ich.
Du rufst writelines komplett ohne Argument/Parameter auf.
Python:
savedateiwrite = varstemp.writelines() #funktioniert so nicht
writelines möchte in die geöffnete Datei schreiben, in deinem Fall die "saves_donotdelete", allerdings gibst du nicht an, was du schreiben möchtest.
Du müsstest z.B. varstemp.writelines("test") machen oder sowas in der Art.

Nebenbei kannst du diese 3 Zeilen vereinfachen:
Python:
print ()
print ("Aktuell hast du " + str(punkte)  + " Punkte")
print()
#wird zu
print ("\nAktuell hast du " + str(punkte)  + " Punkte\n")
\n macht einen Zeilensprung für dich

Kann es sein, dass deine letzte Zeile
punkte = int(json.loads(savedatei[1]))
das ist, das du eigentlich schreiben möchtest?
 
davisx2 schrieb:
Ah jetzt verstehe ich.
Du rufst writelines komplett ohne Argument/Parameter auf.
Python:
savedateiwrite = varstemp.writelines() #funktioniert so nicht
writelines möchte in die geöffnete Datei schreiben, in deinem Fall die "saves_donotdelete", allerdings gibst du nicht an, was du schreiben möchtest.
Du müsstest z.B. varstemp.writelines("test") machen oder sowas in der Art.

Nebenbei kannst du diese 3 Zeilen vereinfachen:
Python:
print ()
print ("Aktuell hast du " + str(punkte)  + " Punkte")
print()
#wird zu
print ("\nAktuell hast du " + str(punkte)  + " Punkte\n")
\n macht einen Zeilensprung für dich

Kann es sein, dass deine letzte Zeile
punkte = int(json.loads(savedatei[1]))
das ist, das du eigentlich schreiben möchtest?
Ich würde gerne die Variable „Punkte“ überschreiben (Einen Wert darin speichern). Das ist genau die Variable, die am Anfang aufgerufen wird.
Ergänzung ()

Allerdings möchte ich auch noch andere Integers speichern.
Wenn ich jetzt zum Beispiel varstemp.writelines(Punkte) verwende, kann ich das ganze ja nur für Punkte verwenden.
Ergänzung ()

Python:
with open('data.txt', 'w') as outfile:
    json.dump(data, outfile)
Im Internet habe ich das gefunden. Da kommt allerdings kein .writelines vor und dieses
Python:
with abc as xyz
ist mir auch komisch.
 
Zuletzt bearbeitet:
Die Variable zu überschreiben sollte korrekt funktionieren nehme ich mal an.
Ich würde Zeile für Zeile zu schreiben.
Python:
textfile = open("data.txt", "w") #hier aufpassen, dass w den aktuellen Inhalt der Datei löscht
textfile.write(str(punkte) + "\n") #Schreibt die Punkte in eine Zeile und macht  einen Zeilensprung
#Du könntest zb auch jedes Element einer List durchgehen:
testlist = ["Wert1", "234"]
for line in testlist:
    textfile.write(line + "\n")
    #alternativ, kommt drauf an was deine Werte sind:
    textfile.write(json.dumps(line) + "\n")
 
Natürlich erwartet json einen String; json ist Objektserialisierung und Arrays sind Objekte, da würde sich die Katze in den Schwanz beißen.

Also die gesamte Datei lesen, die Zeilen per Join und leerem Delimiter zu einem String zusammenfügen und den dann an Json übergeben.
 
Ich brauch die Liste in einer Zeile, so wie es auch eingelsesen wird. Jetzt mal nur die Interger betrachtet: Kann ich die ohne for-Schleife speichern?

Python:
textfile.write(str(punkte) + "\n")
Kann ich hier eine bestimme Zeile auswählen?
Also Punkte in Zeile 2 speichern [1]?

Mit:
Python:
textfile.write(str(punkte))
Wird die Datei überschrieben. Ich möchte ja eine gewisse Zeile ansteueren, dort die Zeile überschreiben.
 
Zuletzt bearbeitet:
Du kannst es höchstwahrscheinlich auch ohne for-Schleife machen.
Wenn du die Liste wieder so schreiben möchtest, sollte
Python:
textfile.write(json.dumps(list) + "\n")
funktionieren.

Das mit dem Zeilen überschreiben ist etwas komplizierter. Vielleicht hilft sowas wie das hier oder hier weiter.
Ich denke alles einzulesen, die Werte anzupassen und alles wieder rauszuschreiben wird die einfachste Lösung.
Aber vielleicht kann da jemand mit mehr Erfahrung helfen.
 
Zuletzt bearbeitet:
Ich habe mich jetzt dazu entschieden, dass ich jeden Wert in einer eigenen Datei speicher.
Ist zwar nicht unbedingt optimal, aber es sollte funktionieren.
Jetzt möchte ich erstmal die Werte (Integers) einleisen.
Das ganze mach ich so:
Python:
punktetemp = open("saves_punkte", "r+")
savepunkte = punktetemp.readlines()

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

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

einschmelzfaktortemp = open("saves_einschmelzfaktor", "r+")
saveeinschmelzfaktor = einschmelzfaktortemp.readlines()

einschmelzfaktorpreistemp = open("saves_einschmelzfaktorpreis", "r+")
saveeinschmelzfaktorpreis = einschmelzfaktorpreistemp.readlines()

zermahlfaktortemp = open("saves_zermahlfaktor", "r+")
savezermahlfaktor = zermahlfaktortemp.readlines()

zermahlfaktorpreistemp = open("saves_zermahlfaktorpreis", "r+")
savezermahlfaktorpreis = zermahlfaktorpreistemp.readlines()

baufaktortemp = open("saves_baufaktor", "r+")
savebaufaktor = baufaktortemp.writelines()

baufaktorpreistemp = open("saves_baufaktorpreis", "r+")
savebaufaktorpreis = baufaktorpreistemp.writelines()

Beziehungsweise weiter unten dann das Deklarieren:
Python:
abbaufaktor = int(json.loads(saveabbaufaktor[0]))
abbaufaktorpreis = int(json.loads(saveabbaufaktorpreis[0]))
einschmelzfaktor = int(json.loads(saveeinschmelzfaktor[0]))
einschmelzfaktorpreis = int(json.loads(saveeinschmelzfaktorpreis[0]))
zermahlfaktor = int(json.loads(savezermahlfaktor[0]))
zermahlfaktorpreis = int(json.loads(savezermahlfaktorpreis[0]))
baufaktor = int(json.loads(savebaufaktor[0]))
baufaktorpreis = int(json.loads(savebaufaktorpreis[0]))

Das ganze funktioniert auch soweit auch, doch bei:
Python:
baufaktor = int(json.loads(savebaufaktor[0]))
baufaktorpreis = int(json.loads(savebaufaktorpreis[0]))
sagt er mir folgendes:
Code:
Traceback (most recent call last):
  File "OreCraft.py", line 32, in <module>
    savebaufaktor = baufaktortemp.writelines()
TypeError: writelines() takes exactly one argument (0 given)


------------------
(program exited with code: 1)

Drücken Sie eine beliebige Taste . . .
Keine Ahnung warum, denn es sollte doch eigentlich funktionieren.
Ich habe bei baufaktor nichts anderes gemacht wie bei anderen Werten weiter oben.
Kann mir da wer weiterhelfen.
 
hä? er sagt dir doch nicht beim Lesen ist der Fehler, sondern beim Schreiben ... liest du die Fehlermeldungen auch richtig? Da steht
savebaufaktor = baufaktortemp.writelines()

und die Fehlermeldung ist auch eindeutig:

writelines() takes exactly one argument (0 given)

Außerdem wurde dir doch schon mal gesagt, du musst ein Argument übergeben, was wohl ein Iterable ist. Was soll er denn sonst reinschreiben wenn du nix angibst und auf dem File Object writelines() aufrufst
 
Zuletzt bearbeitet:
Es ist meiner Meinung nach ein Phänomen. warum manche Leute in Foren andere immer anmotzen müssen.
Mein Gott ich bin halt kein Profi, deswegen verstehe ich manche Dinge nicht und frage.
Ergänzung ()

Ich habe bei den Zeilen davor auch kein Argument übergeben übergeben, und es funktioniert. Ich wüsste ehrlich gesagt auch nicht welches Argument ich da übergeben soll.
 
Zuletzt bearbeitet:
Was willst du denn zu dem Zeitpunkt erreichen?
Python:
baufaktortemp = open("saves_baufaktor", "r+")
savebaufaktor = baufaktortemp.writelines()

baufaktorpreistemp = open("saves_baufaktorpreis", "r+")
savebaufaktorpreis = baufaktorpreistemp.writelines()
Wenn du eine Leerzeile schreiben möchtest, solltest du writelines("\n") benutzen.
Wobei ich mir gerade nicht sicher bin ob es nicht eher write statt writelines sein sollte.
Wenn du die Datei nur öffnen willst um später zu schreiben, solltest du das writelines weglassen.
Methoden funktionieren nach Definition. Wenn wie hier bei writelines ein Argument erwartet wird, MUSS es mit einem Argument ausgeführt werden.
Wenn du nicht weißt was du hier bei writelines angeben sollst, brauchst du es hier wahrscheinlich gar nicht :D
 
Das ist sozusagen die Vor-Maßnahme für das Zuweisen von Variablen mit Werten aus den Dateien.
In den Dateien steht in der ersten Zeile immer nur eine Zahl. Die möchte ich am Anfang des Programms den Variablen zuweisen:
Python:
abbaufaktor = int(json.loads(saveabbaufaktor[0]))
abbaufaktorpreis = int(json.loads(saveabbaufaktorpreis[0]))
einschmelzfaktor = int(json.loads(saveeinschmelzfaktor[0]))
einschmelzfaktorpreis = int(json.loads(saveeinschmelzfaktorpreis[0]))
zermahlfaktor = int(json.loads(savezermahlfaktor[0]))
zermahlfaktorpreis = int(json.loads(savezermahlfaktorpreis[0]))
baufaktor = int(json.loads(savebaufaktor[0]))
baufaktorpreis = int(json.loads(savebaufaktorpreis[0]))
Dafür muss ich doch zuerst folgenden Schritt machen:
Python:
punktetemp = open("saves_punkte", "r+")
savepunkte = punktetemp.readlines()

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

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

einschmelzfaktortemp = open("saves_einschmelzfaktor", "r+")
saveeinschmelzfaktor = einschmelzfaktortemp.readlines()

einschmelzfaktorpreistemp = open("saves_einschmelzfaktorpreis", "r+")
saveeinschmelzfaktorpreis = einschmelzfaktorpreistemp.readlines()

zermahlfaktortemp = open("saves_zermahlfaktor", "r+")
savezermahlfaktor = zermahlfaktortemp.readlines()

zermahlfaktorpreistemp = open("saves_zermahlfaktorpreis", "r+")
savezermahlfaktorpreis = zermahlfaktorpreistemp.readlines()

baufaktortemp = open("saves_baufaktor", "r+")
savebaufaktor = baufaktortemp.writelines()

baufaktorpreistemp = open("saves_baufaktorpreis", "r+")
savebaufaktorpreis = baufaktorpreistemp.writelines()

Es funktioniert auch bis ich da ankomme:
Python:
baufaktortemp = open("saves_baufaktor", "r+")
savebaufaktor = baufaktortemp.writelines()

baufaktorpreistemp = open("saves_baufaktorpreis", "r+")
savebaufaktorpreis = baufaktorpreistemp.writelines()
 
Ok, lass die Zeilen mal weg und mach ohne sie weiter. Oder beleg die Werte mit der Zahl 0 vor, statt writelines aufzurufen
 
Also ich wuerde ja auch JSON empfehlen.

Python:
import random # wird fuer die beispiel daten verwendet
import json

try:
    # datei einlesen
    with open('save.json', encoding='utf-8-sig') as json_file:
        try:
            # json laden
            data = json.load(json_file)
        except json.decoder.JSONDecodeError:
            # leeres dict anlegen wenn json nicht lesebar
            data = {}
except FileNotFoundError:
    # leeres dict anlegen wenn datei nicht vorhanden
    data = {}

# werte in variablen schreiben, falls nicht im dict vorhanden wird ein standard wert gesetzt
punkte =                data['punkte']                 if 'punkte' in data else 0
abbaufaktor =           data['abbaufaktor']            if 'abbaufaktor' in data else 0
abbaufaktorpreis =      data['abbaufaktorpreis']       if 'abbaufaktorpreis' in data else 0
einschmelzfaktor =      data['einschmelzfaktor']       if 'einschmelzfaktor' in data else 0
einschmelzfaktorpreis = data['einschmelzfaktorpreis']  if 'einschmelzfaktorpreis' in data else 0
zermahlfaktor =         data['zermahlfaktor']          if 'zermahlfaktor' in data else 0
zermahlfaktorpreis =    data['zermahlfaktorpreis']     if 'zermahlfaktorpreis' in data else 0
baufaktor =             data['baufaktor']              if 'baufaktor' in data else 0
baufaktorpreis =        data['baufaktorpreis']         if 'baufaktorpreis' in data else 0

print('eingelesene daten:', data)

# random daten als beispiel erzeugen
data['punkte'] = random.randint(0, 9999)

print('geaenderte daten:', data)

# json datei speichern
with open('save.json', 'w') as json_file:
    json.dump(data, json_file)
 
Zurück
Oben