本地变量即将在python中使用

时间:2016-01-14 03:07:50

标签: python

我在python中创建一个获取用户名的登录系统,然后检查文本文件中的一行,然后检查下一行,直到找到它,然后检查第二个文件(密码文件)上的同一行并确认密码用户名。当我尝试登录帐户时,我会不断循环直到它自行打破。它找不到的变量是checkusername函数中的行

u = open('user', 'r+')
p = open('password', 'r+')


def main():
    accountcheck()


def accountcheck():  # check if the user has an account
    account = input('Do you have an account?\n')
    if account == 'yes':
        new = 0
        username(new)
    elif account == 'no':
        new = 1
        username(new)
    else:
        print(account, 'Is not a valid answer. Please try again')
        accountcheck()


def username(new):  # input username
    userlist = u.read().splitlines()
    user = input('Please enter your username\n')
    if user in userlist and new == 0:
        checkuser(user, new)
    elif new == 1 and user not in userlist:
        password(user, new)
    elif new == 1 and user in userlist:
        print('Username taken')
        username(new)
    else:
        print('Username is not fount in our database. Please try again')
        username(new)


def checkuser(user, new):  # scan the username file for the username
    line = 1
    ulines = u.readlines(line)
    if user != ulines:
        line = line + 1
        checkuser(user, new)
    elif ulines == user:
        password(user, new)


def password(user, new):
    passwordlist = p.read().splitlines()
    password = input('Please enter your username\n')
    if password in passwordlist and password != user:
        checkpassword(user, new, password)
    elif new == 1 and password != user:
        writelogin(user, password)
    else:
        print('Password is incorrect. Please try again')
        password(user, new)


def checkpassword(user, line, new, password):
    plines = p.readlines(line)
    if plines != password:
        line = line + 1
    elif plines == password:
        if new == 1:
            writelogin(user, password)
        else:
            print('you have logged in')


def writelogin(user, password):
    userwrite = user + '\n'
    passwordwrite = password + '\n'
    u.write(userwrite)
    p.write(passwordwrite)


main()

如果要运行此文件,则需要在程序所在的同一文件夹中包含用户文本文件和密码文本文件。任何帮助表示赞赏

2 个答案:

答案 0 :(得分:0)

使用递归时要小心:在您的情况下,checkuser()方法的第一行中的'line'值始终设置为'1'。这意味着它将始终读取第一行,并且如果用户不匹配(无限期),则始终再次调用checkuser()。

最好使用简单的循环。

您可能希望将'line'传递给checkuser()方法,例如:

def checkuser(user, new, line=1):
  ...

答案 1 :(得分:0)

我发现您的代码存在以下问题:

  1. 不必要地使用递归:这可能不是现在的问题,但是python有一个限制,你可以做多少递归调用,以避免命中限制改变所有你的函数使用循环。
  2. read / readline / readlines:在我看来,你的印象是当你在文件中连续read时,你总能得到相同的结果,但是当你这样做时却不是这样的。 {1}}第一次获取文件的全部内容时,没有任何神秘感,但如果再次执行u.read(),则不会得到任何结果,因为文件对象内部有一个读指针,指示它在哪里当你按照你所做的读取方式读取指针移动的任何类型时,你可以把它想象成文本编辑器中的心悸u.read(),如果它是|它移动到下一行,但如果它的readlineread移动到文件的末尾,那么从操作中获得的是前一个位置和新位置之间的所有内容。但是不要担心有一种方法可以告诉它在哪里放置readlines方法的指针,在任何读取之前返回到开始执行seek以始终从您的结果获得相同的结果读取。
  3. readline(N)/ readlines(N):就像你之前认为那样在文件中给你一个特定的行但不是这样的情况看看文档
  4.   

    <强>读取(大小= -1)   从流中读取并返回最多大小字符作为单个str。如果大小为负或无,则读取直至EOF。

         

    <强>的readline(大小= -1)

         

    从流中读取并返回一行。如果指定了size,则最多只读取大小字节。

         

    线路终结器总是b&#39; \ n&#39;用于二进制文件;对于文本文件,open()的换行参数可用于选择已识别的行终止符。

         

    <强> readlines方法(提示= -1)

         

    从流中读取并返回行列表。可以指定提示来控制读取的行数:如果到目前为止所有行的总大小(以字节/字符为单位)超过提示,则不会再读取行。

    文档:https://docs.python.org/3/library/io.html#high-level-module-interface