Как вы используете if заявления с текстовыми документами python, которые читаются через CSV?> - PullRequest
0 голосов
/ 16 января 2019

Итак, позвольте мне перейти прямо к делу, мой код должен прочитать .txt файл, затем принять имя пользователя и пароль от пользователя и сравнить его с пользователями из файла. Мой текущий код:

import csv

def user1Authenticate():
    with open('users.txt', mode='r') as file:
        reader = csv.reader(file)
        users = [(row[0], row[1]) for row in reader]
    user1UsernameInput = input("username: ")
    user1PasswordInput = input("password: ")
    print(users[0])
     if (user1UsernameInput, user1PasswordInput) in  users:
        print("Correct")
        return username
    else:
        print("CREATE NEW USER")

def users():
   print('User 1, Please log in.')
   user1 = user1Authenticate()
   print('User 2, Please log in.')
   #user2 = authentication()
   #print("User 1 is", user1, "and user 2 is", user2)

users()

Синтаксис моего файла: «имя пользователя, пароль».

Проблема в том, что он не позволяет мне аутентифицировать имя пользователя и выводит только «CREATE NEW USER».

Кстати, мой учитель сказал, что мы можем использовать только CSV-файлы с текстовым файлом, а не файлы .json или базы данных.

РЕДАКТИРОВАТЬ: Мне также нужно иметь возможность читать несколько пользователей, а не только один.

РЕДАКТИРОВАТЬ 2: Добавлен обновленный код с ума _.

Ответы [ 3 ]

0 голосов
/ 16 января 2019

Решение довольно тривиально. Вы сравниваете строку с кортежем.

ваш список выглядит так users=[('user_name','password')] и users[0] будет первым элементом в списке, который является кортежем ('user_name','password'), и, следовательно, строка 'user_name' никогда не будет равна ('user_name','password')

попробуйте с users[0][0]

 if user1UsernameInput == users[0][0]:
        print("Correct")
        return username
    else:
        print("CREATE NEW USER")

Другой способ - сравнить кортеж

if (user1UsernameInput,user1PasswordInput)==users[0]

Если файл / список состоит из нескольких имени пользователя и пароля. Лучше использовать in оператор

 if (user1UsernameInput,user1PasswordInput) in  users:
0 голосов
/ 16 января 2019

Вы сравниваете (только) имя пользователя с кортежем, который содержит имя пользователя и пароль, как два элемента.

Вы изучаете только первый элемент списка.

Другими словами, вы эффективно делаете

users = [('user1', 'pass1'), ('user2', 'pass2')]
compare_against = users[0]
# compare_against is now the tuple ('user1', 'pass1')
if 'user1' == compare_against:
    pass  # can never reach here

Вы, очевидно, хотите просмотреть все пары пользователей и паролей и проверить, идентичны ли они той паре, которую ввел пользователь.

input_pair = (user1UsernameInput, user1PasswordInput)
for user_pass in users:
    if input_pair == user_pass:
        print("Correct")
0 голосов
/ 16 января 2019

Я думаю, что ваша проблема с этой строкой:

if user1UsernameInput == users[0]:

как ранее вы создали users, который является списком кортежей, следовательно, user [0] означает кортеж (первый кортеж из списка), вероятно, вы пропустили второй индекс там, и он должен быть

if user1UsernameInput == users[0][0]:

РЕДАКТИРОВАТЬ: Исправлено в соответствии с предложением @Idlehands, спасибо.

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