Wie Integer richtig in Datei speichern?

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
Instinkt
User
Beiträge: 4
Registriert: Sonntag 26. Juli 2020, 19:49

Hallo,

ich bin sehr neu in der Welt des Codings und versuche mir gerade etwas Grundwissen beizubringen (mit Google / diesem Forum etc).

Nun zur Frage:
Ich möchte einen Wert immer um 1 hochzählen lassen, wenn eine bestimmte Aktion passiert (bei mir, wenn ich einen Schalter betätige). Funktioniert auch alles soweit.+
Nun möchte ich diesen Wert in einer Datei speichern und den vorhandenen Wert auslesen, um eins erhöhen und wieder speichern.

Auslesen geht, speichern geht, allerdings wird das hintereinander gespeichert und nicht, so wie es sollte, die eine Zahl in der Datei hochgezählt.
Nun die Frage: Macht das überhaupt Sinn? Wenn ja, wie ist das realisierbar?

Code: Alles auswählen

 
        fobj = open("zahlen.txt", "r+")
        wert = int(fobj.read())
        fobj.write(str(wert + 1))
        print("Zahlen: ", fobj.read())
        #print("GPIO 3 Status von 1 auf 0 geändert!")
        time.sleep(0.5)
        fobj.close()
Biei "Zahlen" bekomme ich nichts als Antwort zurück

Viele Grüße
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Der Dateimodus `r+` ist für Textdateien nie sinnvoll. In Python ist alles ein Objekt, eine Variable fobj zu nennen, ist also nicht sehr aussagekräftig.
Lesen und Schreiben sind zwei Schritte

Code: Alles auswählen

FILENAME = "zahlen.txt"
...
with open(FILENAME, encoding="ASCII") as file:
    value = int(file.read())
value += 1
with open(FILENAME, mode="w", encoding="ASCII") as file:
    file.write(str(value))
nezzcarth
User
Beiträge: 1636
Registriert: Samstag 16. April 2011, 12:47

Da laufen einige Dinge schief in deinem Code. Zum Beispiel öffnest du die Datei nur einmal zum Lesen, versuchst aber auch, zu schreiben. Öffnen/Schließen von Dateien macht man in python auch immer mit einem Kontextmanager (with). Mir ist wegen "Zahlen" im print-Statement auch nicht klar, ob es jetzt um eine oder mehrere Zahlen geht.

Hier mal ein Beispiel, wie man das aufbauen könnte:

Code: Alles auswählen

#!/usr/bin/env python3
from time import sleep

FILE = 'zahlen.txt'


def store_value(value, file):
    with open(file, 'w', encoding='utf-8') as f:
        print(value, file=f)


def get_value(file):
    with open(file, 'r', encoding='utf-8') as f:
        value = int(f.readline())
        return value 


def main():
    try:
        value = get_value(FILE)
    except FileNotFoundError:
        value = 0
    if value is not None:
        print('Zahl:', value)
        sleep(0.5)
        value += 1
        store_value(value, FILE)


if __name__ == '__main__':
    main()
Instinkt
User
Beiträge: 4
Registriert: Sonntag 26. Juli 2020, 19:49

Schon einmal herzlichen Dank für eure Antworten :)

Es handelt sich um eine Zahl, die immer gelesen, dann hochgezählt und dann wieder gespeichert werden soll.
Instinkt
User
Beiträge: 4
Registriert: Sonntag 26. Juli 2020, 19:49

Code: Alles auswählen


def get_value(FILENAME):
 with open(FILENAME, encoding="ASCII") as file:
    value = int(file.read())

    
def save_value(value, FILENAME):
    with open(FILENAME, mode="w", encoding="ASCII") as file:
        file.write(str(value))

while True:
    if GPIO.input(23) == 0:
    	#weiß leider noch nicht, wie ich "value" hochzähle. Bekomme hier immer einen FEhler.
        value = get_value("zahl.txt")
        save_value(value, "zahl.txt")
        print("Zahl: ", value)
        
        
time.sleep(0.5)


Nun wird im ersten Durchgang "None" gespeichert in der Textdatei und dann läuft es natürlich nicht mehr weiter.
Habe allerdings händisch "0" eingetragen.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Eingerückt wird immer mit vier Leerzeichen pro Ebene, und da fehlt ein `return`.
nezzcarth
User
Beiträge: 1636
Registriert: Samstag 16. April 2011, 12:47

Großschreibung von Namen ist Konstanten vorbehalten und das in den Funktionen in deinem Code sind keine. Du berücksichtigst auch nicht den Fall, dass die Datei noch nicht existiert.
Instinkt
User
Beiträge: 4
Registriert: Sonntag 26. Juli 2020, 19:49

Hallo und herzlichen Dank.
Jetzt funktioniert das Ganze. Das mit dem Einrücken war mir nicht ganz klar.

Nochmals vielen lieben Dank euch beiden.
Dass die Datei fehlt, ist für mich nicht relevant, da das sowieso "nur" ein Test ist, werde den Check aber selbstverständlich einbauen. Möchte ja auch viel lernen dadurch.

Auch der Hinweis mit den Konstanten ist perfekt, habe diesen Namen nun klein geschrieben.

Nochmals vielen lieben Dank :)
Antworten