Как писать и читать из разных строк в текстовом файле? - PullRequest
0 голосов
/ 18 июня 2020

У меня есть очень простая программа входа в систему, которую я почти закончил. Я пытаюсь заставить мою функцию make_acc() записать имя пользователя в строке 1 и пароль в строке 2, а также заставить мою функцию login() читать эти отдельные строки в соответствии с тем, что необходимо проверить. Я почти уверен, что ответ связан с пометкой команды readline, для какой строки необходимо прочитать, но я не уверен, как правильно реализовать это в моем коде. Вот код.

# This function has the user input a username for their account
def make_acc():
    username = input('Make a username:')
    file = open('acc_data.txt','w')
    file.write(username)
    file.close()
    #password = input('Make a password:')
    #file = open('acc_data.txt','w')
    #file.write(password)

# This function has the user login to a preexisting account
def login():
    input_user = input('Enter your username:')
    file = open('acc_data.txt','r')
    username = file.readline()
    if input_user == username:
        print('You are now logged in')
    else:
        print('That user does not exist')
        login()

# This variable will be defined as a yes or no depending on whether or not the use has an account
acc_bool = input('Do you already have an account?:')

# This if statement runs the login() function if the user answered yes to the previous input
if acc_bool == 'yes':
    login()
# This elif statement runs the make_acc() function if the user answered no to the previous input
elif acc_bool == 'no':
    make_acc()
    login()

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Это должно сработать:

def make_acc():
    username = input('Make a username:')
    password = input('Make a password:')
    with open('acc_data.txt','a') as file:
        file.write(username+'\n')
        file.write(password)

def login():
    input_user = input('Enter your username:')
    with open('acc_data.txt','r') as file:
        if input_user in [u for i,u in enumerate(file.readlines()) if not u%2]:    
            print('You are now logged in')
        else:
            print('That user does not exist')
            login()

Вместо того, чтобы иметь имена пользователей и пароли в двух строках,
вы можете использовать индексы, чтобы определить, является ли строка именем пользователя или паролем:
четные индексы предназначены для имен пользователей, а нечетные - для паролей.


ОБНОВЛЕНИЕ:

Эта часть: [u for i,u in enumerate(file.readlines()) if not u%2] перечисляет все строки в file.readlines() (список всех строк в f.read ()) , если индекс строки i не оставляет остатка при делении на 2.

Вы видите , enumerate() в основном позволит нам перебирать массив и позволяет легко получить доступ к индексу текущей итерации.

0 голосов
/ 18 июня 2020

Сначала раскомментируйте часть make_acc, которая запрашивает пароль, и добавьте file.close().

Затем обратите внимание, что когда вы запускаете программу и вводите две части информации, только один остается в файле, потому что при вызове open() вы используете режим w, который обрезает файл перед тем, как разрешить вам запись. Следствием этого является то, что при повторном открытии файла через пару строк вся ранее сохраненная информация теряется. Решение состоит в том, чтобы использовать режим r+ или a или просто не закрывать файл до конца функции, чтобы избежать повторного открытия его при написании пароля.

Затем при чтении из файла , вы можете использовать file.readline() так же, как вы это уже делаете. Выбор строки для чтения происходит по умолчанию, потому что каждый вызов readline продвигает вперед, какая строка читается. Это означает, что при втором вызове с момента открытия файла будет прочитана вторая строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...