2016-02-04 2 views
1

У меня есть этот текстовый файл, который содержит:чтение построчно из текстового файла

Ryan#Male#Ryan123#Ryan321# 
Lina#Female#Lina123#Lina321# 

заказ Name#Gender#username#password.

user = username.get() //from tkinter entry 
pass = password.get() 
counter = IntVar() 
counter = 0 

file = open("user.txt", "r") 
for login in file: 
    login = login .split('#') 
    if user == login [2]: 
     counter += 1 
    if pass== login [3]: 
     counter += 1 

file.close() 

if counter == 2: 
    //go to next page 
else: 
    print "wrong username or password!" 

это работает, но когда я попытался распечатать логин [2], он вернулся;

Ryan123 
Lina123 

и когда я Ryan в качестве имени пользователя, я до сих пор могу войти, используя Lina «s пароль Aswell. Как я могу заставить его проверять содержимое в строке файла .txt на строку?

Я имею в виду, как проверить эту строку первой:

Ryan#Male#Ryan123#Ryan321# 

и когда информация Логин не найден, он будет переходить к следующей строке.

+1

вероятно не связан: ваши отступы неправильно в течение цикла, кик 'Войти = войти в .split («#»)' в одной вкладке – Pynchia

+1

yep, вы проверяете два разных поля, возможно, лежащих на двух разных строках (например, пользователь соответствует Ryan, а пароль соответствует Lina's). Обычно пользователь и пароль должны совпадать для одного заданного пользователя – Pynchia

+1

Будьте осторожны, 'pass' - это ключевое слово python. – keksnicoh

ответ

2

Проблема с паролем заключается в том, что вы никогда не перезапускаете счетчик между строками. Но это можно сделать еще проще без подсчета условий:

file = open("user.txt", "r") 
for login in file: 
    login = login.split('#') 
    if user == login[2] and password == login[3]: 
     print 'Correct username/password' 
     break 
else: 
    print 'Invalid username/password' 

pass, кстати, является ключевым словом в Python, так что это хорошая идея, чтобы использовать что-то другое для вашего имени переменной.

+0

Да, я просто изменил 'pass' на что-то другое. это легко понять и очень эффективно. благодаря! – procatmer

1

Здесь необходимо условие «и», так как пароль и имя пользователя должны совпадать!

he_is_cool = False 
for login in file: 
    login = login .split('#') 
    if user == login [2] and pass== login [3]: 
     he_is_cool = True 
     break 

file.close() 

if he_is_cool: 
    //go to next page 
else: 
    print "wrong username or password!" 

Обратите внимание, что break будет «убивать» свой цикл, когда вы определили пользователя. Программа также будет работать без break.

1

Вы проверяете два разных поля, возможно, лежащих на двух разных линиях (например, пользователь соответствует Ryan, а пароль соответствует Lina's).

Обычно пользователь и пароль должны совпадать для одного данного пользователя.

Таким образом, вы можете избавиться от счетчиков и попробовать с

pwd = password.get() 
with open("user.txt", "r") as file: 
    for login in file: 
     login = login .split('#') 
     if user == login[2] and pwd == login[3]: 
      pass # go to next page, substitute pass on this line! 
    else: 
     print "wrong username and password!" 
+0

Я считаю, что вы хотите 'break', а не' pass'. EDIT: Я понимаю, почему вы использовали 'pass' сейчас. Тем не менее, я бы рекомендовал вам выйти из цикла и закрыть файл, прежде чем перенаправить на новую страницу. (Кроме того, ваш синтаксис комментариев неверен. Python использует '#' для комментариев по одной строке.) – pzp

+0

@pzp nope, извините. Я использовал пропуск после комментария, я имею в виду заменить код на 'go next page' напрямую. Теперь отредактировано. спасибо – Pynchia

Смежные вопросы