有一个while循环的问题,它会中断,即使它不应该

时间:2014-12-30 12:21:50

标签: python while-loop

我在使用while循环时遇到了麻烦!

我要做的是创建一个简单的帐户创建系统。我希望用户输入用户名,如果用户名已经存在,那么我应该再试一次。

但即使用户名存在,它也会继续执行该功能,并要求我输入密码,并将用户名和密码写入文件。

这是代码:

def create_user():
    passw = open('passwords.txt', 'r+')
    x = 1
    passwr = passw.readlines()
    print "What's your username?"

    while x == 1:
        user = raw_input(">> ")
        for l in passwr:
            a = l.split()  
            if user.lower() not in a[0]:
                x = 0

            else:
                print 'Sorry, that\'s already in use!'

    print "What's your pw?"
    pw = raw_input(">> ")
    passw.seek(0, 2)
    passw.write(user + ' ' + pw + '\n')

文件格式如下:

Username1 Password
Username2 Password

我试图找出一段时间的错误。但似乎无法找到解决方案。

3 个答案:

答案 0 :(得分:3)

您的验证部分可以更简单尝试这样的事情

while x == 1:
    user = raw_input(">> ")
    usernames = [i.split()[0] for i in passwr]
    if user.lower() not in usernames:
            x = 0

    else:
            print 'Sorry, that\'s already in use!'

输出将是

What's your username?
>> Username1
Sorry, that's already in use!
>> Username2    
Sorry, that's already in use!
>> Username3
What's your pw?
>> Password

和文件内容

username1 Password
username2 Password
Username3 Password

答案 1 :(得分:3)

您需要查看==而非in,因此您无需额外分配a = l.split(),请将if语句更改为以下内容:

if user.lower() == l.split()[0]

因为这项工作用于检查一个ID,如果您需要检查所有ID,您可以在列表中获取所有ID并检查:

while x == 1:
    user = raw_input(">> ")
    user-list=[line.split()[0] for line in passwr]  
    if user.lower() not in user-list:
            x = 0

答案 2 :(得分:3)

问题是,如果任何用户具有不同的用户名,则设置x = 0。想象一下,现有两个用户foobar。用户输入bar。发生这种情况:

  1. if user.lower() not in a[0]:生成True,因为user"bar"a[0]"foo"
  2. x设置为0
  3. 循环继续文件中的下一行,a[0]现在为"bar"
  4. if user.lower() not in a[0]:生成False,并打印Sorry, that's already in use!
  5. 循环退出,因为x已设置为0