Seite 1 von 1

Probleme beim auslesen von Strings einer Datei

Verfasst: Samstag 18. Juli 2020, 16:31
von FynnDE
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!

Re: Probleme beim auslesen von Strings einer Datei

Verfasst: Samstag 18. Juli 2020, 16:46
von Sirius3
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.

Re: Probleme beim auslesen von Strings einer Datei

Verfasst: Samstag 18. Juli 2020, 17:47
von FynnDE
Vielen Dank!