Daten Speichern und verändern

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
MAAX
User
Beiträge: 1
Registriert: Samstag 20. April 2024, 12:02

Hallo
ich bin neu in der Python Welt und habe eine kleine Frage bezüglich arbeiten mit Daten (.txt)

Ich will ein Geldaufnahme Programm schreiben wo ich Daten speichern muss und regelmäßig updaten will.
Zum Programm: Nachdem mein Lohn kam will ich alle meine Kontostände aktualisieren und diese sollen dann gespeichert werden und auf Wunsch aufrufbar sein.

(Erfundenen Zahlen)

Hier ist das Dictunary in der TXT datei:

Bestände = {
"Sparbuch" : 1000,
"Girokonto" : 2000,
"Depot : 3000,
"Bar" : 4000
}

Mein Lohn (3.000€ ) kommt und ich verteile das Geld auf die Konten.

Hier fange ich in der Geldaufnahme.py Datei an:

Sparbuch1 = input("Was ist der Aktuelle stand? ") #verändert um +1.000
Girokonto2 = input("Was ist der Aktuelle stand? ") #verändert um +1.000
Depot3 = input("Was ist der Aktuelle stand? ")
Bar4 = input("Was ist der Aktuelle stand? ") #verändert um +1.000

Jetzt zu meinem ersten Problem:

Wie kann ich die Daten aus der txt datei in meiner .py Datei als Dictunary rüber holen und dann selbständig bearbeiten?

bzw
Die Bestände: Sparbuch/ Girokonto und Bar verändern sich um jeweils 1.000€
wie kann ich das in der Txt datei aktualisieren?

Zu meinem zweiten Problem:

Ich will nur den Bestand des Depotes wissen wie lese ich das gezielt aus der txt datei aus?

zu meinem Dritten Problem:

Ist txt datei das richtige hierfür?



Ich hoffe es war verständlich
danke schonmal im voraus :mrgreen:
Benutzeravatar
__blackjack__
User
Beiträge: 13131
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@MAAX: Python-Quelltext eignet sich nicht wirklich für das Speichern von Daten die verändert werden sollen. Da nimmt man am besten ein Format das standardisiert ist und für das es Bibliotheken zum lesen und schreiben gibt. Beispielsweise JSON. Da gibt es ein Modul in der Python-Standardbibliothek für.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Man nummeriert keine Namen. Hier macht das ja auch überhaupt gar keinen Sinn bei unterschiedlichen Namen eine laufende Nummer anzuhängen.

Letztlich machen aber auch die unterschiedlichen Namen keinen Sinn. Es gibt vier Konten für die alle das gleiche gemacht werden soll. Und die stehen in einer Datenstruktur. Also schreibt man da eine Schleife die über die Konten iteriert und den Code der den aktuellen Stand vom Benutzer erfragt *einmal*.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
jokershortbread
User
Beiträge: 1
Registriert: Montag 22. April 2024, 10:37

Um die Daten aus der TXT-Datei in deiner Python-Datei als Dictionary zu importieren, kannst du die Funktion eval() verwenden. Hier ist ein Beispielcode, wie du das machen könntest:
with open('kontostand.txt', 'r') as file:
kontostand_data = file.read()

kontostand_dict = eval(kontostand_data)
print(kontostand_dict)
Das kontostand.txt ist der Name deiner TXT-Datei, in der die Kontostände gespeichert sind. Diese Methode ist jedoch nicht die sicherste, da eval() potenziell unsicheren Code ausführen kann. Alternativ könntest du das Modul json verwenden, um Daten in einer sicheren Weise zu speichern und zu laden.
Zu deinem zweiten Problem:
Um den Bestand des Depots gezielt aus der TXT-Datei auszulesen, kannst du einfach auf das entsprechende Schlüssel-Wert-Paar im Dictionary zugreifen, nachdem du es geladen hast:
depot_bestand = kontostand_dict['Depot']
print("Aktueller Depotbestand:", depot_bestand)
depot_bestand = kontostand_dict['Depot']
print("Aktueller Depotbestand:", depot_bestand)
Sirius3
User
Beiträge: 17767
Registriert: Sonntag 21. Oktober 2012, 17:20

@jokershortbread: wie Du ja selbst schreibst, ist `eval` nicht sicher; um es genauer zu sagen, es ist ungeeignet, um Daten zu lesen. In diesem Fall kann JSON exakt das gleiche.

@MAAX: beim Programmieren möchte man möglichst generellen Code schreiben, hier also welchen, dem es egal ist, welche Kontoarten es gibt.

Das ganze könnte also so aussehen:

Code: Alles auswählen

import json

ACCOUNT_FILENAME = "accounts.json"
DEFAULT_ACCOUNTS = ["Sparbuch", "Girokonto", "Depot", "Bar"]

def read_accounts(filename):
    try:
        with open(filename, 'rb') as file:
            return json.load(file)
    except IOError:
        return dict.fromkeys(DEFAULT_ACCOUNTS, 0)


def write_accounts(filename, accounts):
    with open(filename, "w", encoding="utf8") as file:
        json.dump(accounts, file)

def input_float(prompt):
    while True:
        try:
            return float(intput(prompt))
        except ValueError:
            print("Bitte eine Zahl eingeben")

def main():
    accounts = read_accounts(ACCOUNT_FILENAME)
    for account, value in accounts.items():
        print(f"Du hast gerade {value}€ auf {account}.")
        new_value = input_float("Was ist der neue Stand?")
        accounts[account] = new_value
    write_accounts(ACCOUNT_FILENAME, accounts)

if __name__ == "__main__":
    main()
Benutzeravatar
__blackjack__
User
Beiträge: 13131
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@jokershortbread: Wenn man Quelltext mit literalen Python-Grunddatentypen parsen muss (was man eher nicht will wenn sich das vermeiden lässt) verwendet man das sichere `literal_eval()` aus dem `ast`-Modul in der Standardbibliothek.

Python-Grunddatentypen haben nichts in Namen verloren. Den Typen ändert man gerne mal im Laufe der Programmentwicklung, beispielsweise zu einem spezialisierteren Datentyp, manchmal sogar etwas selbst geschriebenes, und dann muss man überall die betroffenen Namen suchen und anpassen, oder hat falsche, irreführende Namen im Programm.

Bei Wörterbüchern und anderen Abbildungen bildet man oft einen Namen aus dem was ein Schlüssel bedeutet und was der dazugehörige Wert bedeutet. Also hier beispielsweise `kontoname_zu_stand`, oder `account_name_to_balance`. Dann weiss der Leser was da auf was abgebildet wird.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Antworten