Python – не удается прочитать весь файл .txt: ошибка .readlines?

Я пытаюсь заставить python полностью прочитать мой файл .txt, чтобы установить действительность имени пользователя/пароля... Но, похоже, он читает только первую строку и игнорирует остальные. Только первое имя пользователя/пароль в .txt предоставит доступ.

def login():
username = textentry.get()
password = textentry2.get()
database=open('database.txt')
for line in database.readlines():
    usr, pas = line.strip().split("-")
    if (username in usr) and (password in pas):
        credentialcheck.insert(END, "welcome")
        return True
    credentialcheck.insert(END, "username or password incorrect")
    return False

Который все пробежал через это:

def accessgranted():
    credentialcheck.delete(0.0, END)
    userandpass=login()
    if userandpass == True: quit()

Текстовый файл:

abc-123
test-test
user-pass

person at8k    schedule 05.08.2018    source источник
comment
удалите return True из конструкции if. Также используйте генераторы для чтения из файла, так как это более эффективно!   -  person Swadhikar    schedule 05.08.2018


Ответы (3)


Чтобы упростить код, я внес некоторые изменения, не влияющие на результат.

def login():
  username = "test"
  password = "test"
  database=open('database.txt')
  for line in database.readlines():
     usr, pas = line.strip().split("-")
     if (username in usr) and (password in pas):
         print ("welcome")
         return True
     print ("error")
     return False
login()

Чтобы проверить полный результат метода чтения строк, я распечатал списки, считанные из файла.

def login():
    username = "test"
    password = "test"
    database=open('database.txt')
    print (database.readlines())
    for line in database.readlines():
        print (line)
        usr, pas = line.strip().split("-")
        print (usr,pas)
        if (username in usr) and (password in pas):
            print ("welcome")
            return True
        print ("error")
        return False
login()

Выход:

['abc-123                                                                 \n', 'test-test                                                               \n', 'user-pass']

Следовательно, ошибка связана не с тем, что database.readlines() не работала, а с кодами после print (database.readlines()).

И database.readlines() становится []!

Это связано с тем, что файловый курсор указывал на конец файла после того, как мы впервые назначаем метод readlines. Поэтому мы не можем читать больше символов, пока не изменим файловый курсор на начало файла.

И ваша проблема заключается в возвращении после каждого завершения предложения if-case! После изменения отступа предложения return false, который будет назначен, если имя пользователя и пароль не совпадают, проблема будет решена!

Теперь мы просто модифицируем код:

def login():
    username = "test"
    password = "test"
    database=open('database.txt')
    print (database.readlines())
    print (database.readlines())
    for line in database.readlines():
        print (line)
        usr, pas = line.strip().split("-")
        print (usr,pas)
        if (username in usr) and (password in pas):
            print ("welcome")
            return True
    print ("error")
    return False
login()
person Saige Zhang    schedule 05.08.2018

Потому что вы возвращаетесь в каждой ветви оператора «если». Возврат True в условии if выглядит нормально, но удалите из цикла другой оператор return. Когда цикл завершается без возврата True ни для одной из записей в файле, это означает, что введенные учетные данные недействительны. Затем вы можете вернуть False.

person Sнаđошƒаӽ    schedule 05.08.2018

Вы замыкаете свой цикл, немедленно возвращая False, если первая строка не совпадает. Удалите отступы для этих строк, чтобы они вызывались после завершения цикла. Проверка in также неверна, я мог успешно войти в систему с именем пользователя = ab и pw = 1, хотя это не полное имя пользователя или пароль.

def login():
    username = textentry.get()
    password = textentry2.get()
    database=open('database.txt')
    for line in database.readlines():
        usr, pas = line.strip().split("-")
        if (username == usr) and (password == pas):
            credentialcheck.insert(END, "welcome")
            return True
    credentialcheck.insert(END, "username or password incorrect")
    return False
person saarrrr    schedule 05.08.2018