Python不根据输入检查csv

时间:2018-10-04 09:40:47

标签: python

我在业余时间创建一个项目,这是一个基于用户的测验,具有得分记录和高分记录。目前,我停留在创建的第一阶段,即登录部分。我为此使用CSV,因为我发现它们比其他方法更容易编辑。

问题在于它仅检查文件的第一行,而没有其他任何检查。当在第一行之后添加人员时,这可能会导致问题,因为它会检查第一行,发现他们不匹配,并在下面引发“错误”错误。

我已经使用print()语句尝试查看输入或python检查csv文件是否存在任何问题,但是一切似乎都很好,它以正确的格式响应完整的csv,因此它应该可以工作。

def login():
        print("\n")
        print("-----------------------------------------")
        print("Create an account")
        print("-----------------------------------------")
        uname = input("Enter name: ")
        pword = input("Enter a password: ")
        print("----------------------------------------")
        print("Please wait...")
        print("-----------------------------------------")
        UD = open(os.path.join(os.path.dirname(__file__), 'users.csv'), 'r')
        for line in UD:
            user = line.split(",")
            print("input for uname is: "+uname)
            print("input for pword is: "+pword)
            print(user[0])
            print(user[1])
            if user[0] == uname and user[1] == pword:
                print("\n")
                print("-----------------------------------------")
                print("Login successful!")
                print("-----------------------------------------")
                UD.close()
            else:
                print("\n")
                print("----------------ERROR!-----------------")
                print("Incorrect username / password!\n")
            break

CSV文件当前仅包含以下条目:

person1 password1
person2 password2

我在做什么错?任何帮助都将不胜感激。

编辑:运行当前代码的输出:

Enter name: person1
Enter a password: password1
----------------------------------------
Please wait...
-----------------------------------------


----------------ERROR!-----------------
Incorrect username / password!

2 个答案:

答案 0 :(得分:0)

您有两个问题。

数据字段之间用空格而不是逗号分隔,因此您要编写

user = line.split(' ')

甚至,因为默认情况下,split()使用空格序列作为分隔符

user = line.split()

我想提到的是,您可以解压拆分结果并为变量使用更重要的名称

user, passwd = line.split()

接下来,您说用户输入与存储的数据不匹配,但这是因为input()从其结果中删除了新行,而文件对象上的迭代返回了确实包含换行的行,因此您必须strip()使用数据项。这可以简单地实现,

user, passwd = [item.strip() for item in line.split()]

最后,我不得不提到您的登录过程不正确,因为如果您的用户提供的用户名和密码分别为"person2""password2",它将对第一行进行检查,将拒绝登录并将打破循环,我敢打赌这不是您想要的...

我会写

for user, passwd in (item.strip() for item in open(...)):
    if user==uname and passwd==pword:
        print('OK')
        success = 1
        break
else:
    print('No login')
    success = 0

if not success: sys.exit()
play_game()

答案 1 :(得分:0)

1。首先,您的csv并不是真的昏迷,因此请修复该问题 2.由于每一行的尾随空白,它一直都在失败 3.这只是一个注释,最好使用with语句,因为它是pythonic方式 4.您可以使用.strip()

解决空白问题

这是解决您问题的有效方法

import os
def login():
    print("\n")
    print("-----------------------------------------")
    print("Create an account")
    print("-----------------------------------------")
    uname = input("Enter name: ")
    pword = input("Enter a password: ")
    print("----------------------------------------")
    print("Please wait...")
    print("-----------------------------------------")
    with open(os.path.join(os.path.dirname(__file__), 'test.csv'), 'r') as f:
        files = f.readlines()

    for f in files:
        # print('Entry: ',f)
        user,pwd = f.split(",")
        print(user,'\t',pwd)
        print("input for uname is: "+uname)
        print("input for pword is: "+pword)

        if user == uname and pwd[:-1] == pword:
            print("\n")
            print("-----------------------------------------")
            print("Login successful!")
            print("-----------------------------------------")
            break
    else:
        print("\n")
        print("----------------ERROR!-----------------")
        print("Incorrect username / password!\n")
    print(len(uname),len(pword))#this is the length of your inputs
    print(len(user),len(pwd))#This is the length of your compare values, note length of password

login()

如果未找到匹配项,则执行for循环中的else,学习新知识