如何在Python中使用CSV读取所有行?

时间:2017-11-18 12:28:19

标签: python csv

在我的情况下,我正在创建一个寄存器,它需要通过使用CSV将登录凭据存储到外部文件中。

我有两个问题:

  1. 除第一个登录名之外的每个登录名(用户名和密码)都没有 我首次登录“ 14JeoJun ”用户名和“海鸥” 有效,但下一个“ 13ParJim ”用户名和“ excuseme ” 密码没有,以及之后的其余部分。我认为这是因为它没有阅读所有的行。
  2. 它不会循环代码3次并在之后关闭。如果你一直弄错了,它会永远循环它,即使是不是第一个但是正确的登录凭据。如果第一个登录凭证正确,则它将停止循环并退出。我认为这是因为上面的第一个问题。

    with open("login_credential.txt","r") as login_credential:
    for x in range (0,2):
        inputted_username = input("Please enter your username - ")
        inputted_password = input("Please enter your password - ")
        login_credentialReader = csv.DictReader(login_credential)
        for lines in login_credentialReader:
                if lines["username"].lower() == inputted_username and lines["password"].lower() == inputted_password:
                    print("Welcome...")
                    sys.exit()
                elif lines["username"].lower() != inputted_username or lines["password"].lower() != inputted_password:
                    x += 1
                    print("Login credentials are incorrect. Please try again.")
                    login()
        if x >= 3:
            print("Too many incorrect tries...")
            sys.exit
    
  3. 这是我的外部文件(login_credential.txt)中的内容:

    的用户名,密码,名,姓,一年
    14JeoJun,海鸥,Jungkook,全度妍2014
    13ParJim,excuseme,济民,公园,2013
    10KimNam,gotjams,Namjoon,Kim,2010

    每当我切换到第一个时,只有第一个会起作用。

2 个答案:

答案 0 :(得分:0)

读取文件一次后,文件句柄将关闭,您无法再次读取它。特别是,请看这里:

with open("login_credential.txt","r") as login_credential:
    for x in range (0,2):
        inputted_username = input("Please enter your username - ")
        inputted_password = input("Please enter your password - ")
        login_credentialReader = csv.DictReader(login_credential)
        for lines in login_credentialReader:
            # ...

        # ...

for x in range(...)循环的第二次迭代中, 文件句柄login_credential已被完全读取, 它不会再被重读, 所以内部for循环的主体不会被执行。

此代码还存在其他严重问题。 例如,在for x in range(...)循环中, 你不应该修改循环体内x的值。 它可能不会像你想象的那样工作, 因为在下一次迭代中,x将重置为来自range(...)的下一个值。不要这样做。

一个小问题,看看这些条件:

if lines["username"].lower() == inputted_username and lines["password"].lower() == inputted_password:
    # ...
elif lines["username"].lower() != inputted_username or lines["password"].lower() != inputted_password:
    # ...

第二个条件与第一个条件相反。 这是毫无意义的,您可以用简单的elif替换长else

根据一般方法, 而不是在用户每次重试用户名/密码时重新读取密码文件, 最好只读取一次文件的行,然后重复使用它。 这将需要更多内存,但节省I / O. 这可能是一个很好的权衡。

它可能是这样的:

with open("login_credential.txt","r") as login_credential:
    login_credentialReader = csv.DictReader(login_credential)
    lines = [line for line in login_credentialReader]

for x in range(2):
    inputted_username = input("Please enter your username - ")
    inputted_password = input("Please enter your password - ")

    # ...

答案 1 :(得分:0)

你目前正在做的是检查每一行,如果它匹配则是否匹配。

需要做的只是检查行,如果匹配,如果不匹配 - 请尝试下一行。只有当文件中的任何一行都不匹配时,您才需要说出错误的凭据 - 该行在循环之后。