Как проверить имя пользователя с помощью внешних файлов .txt - PullRequest
0 голосов
/ 16 декабря 2018

Итак, недавно я занимался проектом кодирования и хочу использовать внешний файл ( .txt file ), который содержит все допустимые имена пользователей.В этом фрагменте кода я проверяю, действительно ли P1Username допустимо.Если имя пользователя допустимо, оно переходит к более поздним частям кода.Если имя пользователя недопустимо ( отсутствует в файле .txt ), оно спросит, хотят ли они зарегистрироваться, где пользователь может выбрать регистрацию ( имя добавлено в файл .txt )или не регистрироваться ( пользователь упоминается как Игрок 1 ).
Проблема заключается в том, что этот код позволяет вводить все имена как действительные, а также не выводит какие-либо операторы печати.Кто-нибудь знает, что делать, чтобы это исправить?

valid=False
username=open("username.txt","r")
lines=username.readlines()
P1Username=input("Enter your username Player 1: ")
for counter in range(len(lines)):
    if P1Username==str(lines[counter]):
        print("Valid username\nHello "+str(P1Username))
        valid=True
        break
    elif valid==False and counter<len(lines):
        next
    elif valid==False and counter>=len(lines):
        enter=""
        while enter!="yes" and enter!="no":
            enter=input("Would you like to register "+P1Username+"? (yes or no) ")
            if enter=="yes":
                username=("username.txt","a")
                username.write(P1Username)
                username.write("\n")
                print(P1Username+" is now a registered login\nHello "+P1Username)
                break
            elif enter=="no":
                P1Username="Player 1"
                print("You did not register the username\nI will refer to you as Player 1")
                break
            else:
                print("Enter yes or no")

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Я бы рекомендовал вместо выполнения цикла for с итерацией по индексу (как вы делаете со счетчиком) использовать цикл for each, например:

valid=False
usernames=open("username.txt","r")
P1Username=input("Enter your username Player 1: ")
for line in usernames.readlines():
    if P1Username in line: 
        valid = True

{go on with your code}

InВаш код вы принесете пользователю, чтобы создать своего пользователя столько раз, сколько имен у вас есть в файле.С помощью приведенного выше кода вы отделяете проверку от процесса впоследствии.

Я думаю, что это упростит ваш код, позволяя быстрее и проще исправлять.

0 голосов
/ 16 декабря 2018

Эта часть

if P1Username==str(lines[counter]):
    print("Valid username\nHello "+str(P1Username))
    valid=True
    break 

никогда не будет выполнена, потому что lines[counter] имеет символ новой строки '\ n' в конце, а пользовательский ввод - нет.Таким образом, даже если имя уже находится в текстовом файле, условие if будет оценено как False (т. Е. 'Username' и 'username \ n' не совпадают.

Эта часть

elif valid==False and counter>=len(lines):
    enter=""
    while enter!="yes" and enter!="no":
        enter=input("Would you like to register "+P1Username+"? (yes or no) ")
        if enter=="yes":
            username=("username.txt","a")
            username.write(P1Username)
            username.write("\n")
            print(P1Username+" is now a registered login\nHello "+P1Username)
            break
        elif enter=="no":
            P1Username="Player 1"
            print("You did not register the username\nI will refer to you as Player 1")
            break
        else:
            print("Enter yes or no")

никогда не будет выполнено, потому что в цикле for, который вы используете, counter будет принимать значения от 0 до len (строки) -1, поэтому counter>=len(lines) никогда не будет True.

Так что я бы что-то вроде

with open("username.txt","r") as f:
    usernames = [line.strip() for line in f]

player1 = input("Enter your username Player 1: ")
if player1 in usernames:
    print(f"Valid username\nHello {player1}")
else:
    while True:
        enter=input(f"Would you like to register {player1}? (yes or no) ").lower()
        if enter == "yes":
            with open("username.txt","a") as f:
                f.write(f'{player1}\n')
            print(f"{player1} is now a registered login\nHello {player1}")
            break
        elif enter == "no":
            player1="Player 1"
            print("You did not register the username\nI will refer to you as Player 1")
            break
        else:
            print("Enter yes or no")
...