如果不在文件中的第n行工作

时间:2015-11-08 20:48:14

标签: python python-3.x

我想用python 3.5创建一个简单的登录系统。它的作用是打开一个包含用户名和密码的文档。该文档在第一行有一个用户名,在第二行有该用户的密码。这将继续通过文档,导致每个奇数行上的用户名和每个偶数行上的密码。循环遍历所有20行(对于10个用户)并将每个奇数行作为用户名,并将每个偶数行作为密码。它通过,并检查用户名和密码是否正确。由于某种原因,它不起作用,它只是要求输入用户名,输入密码,并没有返回任何东西。它正在打开文档,因为它在我打印出用户名和密码时起作用。

username = input('please enter your username')
password = input('please unter your password')

for i in range(0,20,2):
    text_file = open('users.txt','r')
    database = text_file.readlines()
    if username == database[i] and password == database[i+1]:
        print('login accepted')
    else:
        if username == database[i] and password != database[i+1]:
            print('incorrect password')

text_file.close()

2 个答案:

答案 0 :(得分:1)

可能的问题更多地与字符串剥离有关。您有机会获得如下文本文件:

myusername
mypassword
otherusername
otherpassword

当你正在阅读它时,你会得到:

["myusername\n", "mypassword\n", ... ]

您最有可能通过在从文件读取的每一行上使用str.strip来解决此问题。

但是你有比这更多的逻辑错误。这是一个:

for i in range(0, 20, 2):
    text_file = open(...)
    database = text_file.readlines()
    # you really want to open the file and read from it EVERY SINGLE LOOP??

还有:

if username == database[i] or password == database[i+1]:
    # log in if your password is ANYONE'S password, or if your username
    # is ANYONE'S username.

在宏观方案中,您应该预处理文本文件以创建键值对字典。

database = {}  # empty dict

with open('path/to/textfile.txt') as inf:
    while True:
        try:
            username = next(inf)
            password = next(inf)
        except StopIteration:
            break
        else:
            database[username.strip()] = password.strip()

username_in = input("What's your username? ")
password_in = input("What's your password? ")
if database[username_in] == password_in:
    # login successful

但是真的,你永远不应该出于任何原因以纯文本形式存储密码。好主人,伙计,对密码存储做一些研究! :)

答案 1 :(得分:0)

Answer by Adam Smith很棒。 我只能添加该行

if database[username_in] == password_in:
如果您的数据库中没有此类用户名,

可能会导致KeyError。您可能要在检查密码或检查try except块中的密码检查或使用dict.get(key, default)方法从数据库中获取密码之前检查数据库中是否存在用户名

这里有一些代码:

# Pre check
if username_in in database.keys():
    if database[username_in] == password_in:
        # ...
else:
    # No such username in database


# try .. except
try:
    if database[username_in] == password_in:
        # ...
except KeyError:
    # No such username in database


# get with default
# if no default is specified, default is None
if database.get(username_in) == password_in: