Probleme beim auslesen von Strings einer Datei

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
FynnDE
User
Beiträge: 6
Registriert: Dienstag 2. Juni 2020, 14:03

Moin!
Ich bin dabei einen Quiz zu schreiben bei dem man sich anmelden muss und wo die Daten des Nutzers gespeichert werden.
Allerdings bin ich noch nicht mal bis zum Quiz gekommen den das Anmelde Modul läuft irgendwie nicht.
Wenn ich einen Account erstelle mit Benutzernamen und Passwort funktioniert alles wunderbar ich kann mich
einloggen und das Programm neustarten und mich auch wieder neu einloggen.
Wenn ich das Programm allerdings soweit laufen lasse, dass ebenfalls der Score und die Permission
gespeichert werden läuft auf einmal die if klammer nicht mehr die abfragt ob das Passwort korrekt ist.
Jedes Mal heisst es das Passwort wäre falsch obwohl es vor dem abspeichern dieser zwei werte funktioniert hat.
Die Safe Datei ist folgender Maßen aufgebaut:
1:Das Passwort
2:Den aktuellen Score
3:Die jewilige Permission des Nutzers

Das Anmelde Modul:

Code: Alles auswählen

def logedIn(func, userinput1):
    func(userinput1)
def register(func):
    system("cls")
    userinput1 = input("Choose a username:\n")
    userinput2 = getpass.getpass("Choose a password:\n")
    userinput3 = getpass.getpass("Type in your password again:\n")
    if userinput2 == userinput3:
        f = open("User" + userinput1, "w")     
        f.write(userinput2)
        f.close()
        input("The user " + userinput1 + " was succesfully registered! Press ENTER to continue\n")
        login(func)
    if userinput2 != userinput3:
        input("The passwords are not equal! Press ENTER to continue\n")
        register(func)
def login(func):
    system("cls")
    userinput1 = input("Type in your username:\n")
    f = open("User" + userinput1, "r")
    line = f.readlines()
    pwd = line[0]
    userinput2 = input("Type in your password:\n")
    if userinput2 == pwd:
        input("Correct password! Press ENTER to continue\n")
        logedIn(func, userinput1)
    if userinput2 != pwd:
        input("Incorrect password! Press ENTER to continue\n")
        login(func)
    f.close
def accsys(func):
    system("cls")
    var1 = input("Are you registered yet? Yes or No\n")
    var1 = str(var1)
    if var1 == ("Yes"):
        login(func)
    if var1 == ("No"):
        register(func)
    else:
        accsys(func)


Das bisherige Quiz Script:

Code: Alles auswählen

from GERLib import accsys

def main(userinput):
    f = open("User" + userinput, "r")
    line = f.readlines()
    try:
        score = line[1]
    except IndexError:
        score = 0
        Bool1 = True
    try:
        perm = line[2]
    except IndexError:
        perm = "User"
        Bool1 = True
    f.close()
    if Bool1 == True:
        f = open("User" + userinput, "a")
        f.write("\n" + str(score))
        f.write("\n" + perm)
        f.close()
        Bool1 = False
accsys(main)
Danke für jede Antwort!
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Funktion loggedIn ist ziemlich unnötig, weil man func auch direkt aufrufen könnte.
register sollte nicht rekursiv aufgerufen werden, sondern da sollte eine Schleife sein, bis beide Passwörter gleich sind.
Dateien immer mit dem with-Statement öffnen. Benutze aussagekräftige Variablen, userinput mit Nummer ist das nicht.
Zeilen sollten immer mit einem ZeileEndeZeichen abgeschlossen werden, das Du natürlich beim Lesen wieder entfernen mußt. Du denkst, Du benutzt ein Zeileanfangszeichen, was es aber nicht gibt.
Es gibt soetwas wie elif und else, so dass man nicht die umgedrehte Bedingung in einem weiteren if verwenden muß.
Auch `login` sollte nicht rekursiv aufgerufen werden, sondern einfach einen Wahrheitswert an das Hauptprogramm zurückliefern. close sollte man auch aufrufen. Besser with benutzen.
Die selben Anmerkungen gelten natürlich auch für die restlichen Funktionen. Ein guter Programmablauf ist, Funktion aufrufen zurückkehren und mit dem Rückgabewert etwas machen und nächste Funktion aufrufen. Du verschachtelst die Funktionsaufrufe zu sehr, das macht den Programmfluß total unübersichtlich.

Diese vielen Enter-Aufforderungen machen die Bedienung ziemlich umständlich.
Dann solltest Du immer eine Datei mit 3 Zeilen erzeugen, und nicht nachträglich Zeilen hinzufügen.

Code: Alles auswählen

from getpass import getpass

def register():
    while True:
        username = input("Choose a username:")
        password = getpass("Choose a password:")
        repeated_password = getpass("Type in your password again:")
        if password == repeated_password:
            break
        print("The passwords are not equal!")
    with open(f"User{username}", "w", encoding="utf8") as file:
        file.write(f"{password}\n")
        file.write("0\n") # Score
        file.write("User\n") # Permissions

def login():
    while True:
        username = input("Type in your username:")
        with open(f"User{username}", encoding="utf8") as file:
            password, score, permissions = (line.strip() for line in file)
        entered_password = getpass("Type in your password:")
        if password == entered_password:
            print("Incorrect password!")
            break
    print("Correct password!")
    return score, permissions

def ask_registered():
    while True:
        registered = input("Are you registered yet? Yes or No?")
        if registerd in ["Yes", "No"]:
            break
    return registered == "Yes"

def main():
    if not ask_registered():
        register()
    score, permissions = login()

if __name__ == '__main__':
    main()
Dann wäre es noch einfacher, ein etabliertes Datenformat wie json zu benutzen.
FynnDE
User
Beiträge: 6
Registriert: Dienstag 2. Juni 2020, 14:03

Vielen Dank!
Antworten