读取某个输入python的文件

时间:2017-10-17 17:45:34

标签: python python-3.x

所以我正在做一个登录和创建用户名和密码的代码,登录时,我正在读取一个外部文件,其中包含字典形式的所有用户名和密码,例如{" aaaaaaaa":" aaaaaaA999"}

这是阅读它的代码

f3 = open("helloworld.txt","r")
user = input("Enter login name: ")

if user in f3.read():
   passw = input("Enter password: ")
   print("")

   if user in f3.read() and passw in f3.read():
        print ("Login successful!\n")


   else:
        print("")
        print("User doesn't exist!\n")
f3.close()

然而,当我尝试阅读时,它一直说用户不存在,任何建议

3 个答案:

答案 0 :(得分:2)

函数f3.read()一次读取整个文件,并将文件指针移动到结尾。任何后续文件读取而不关闭并重新打开文件将返回None

您需要将文件实际解析为允许您搜索包含的数据结构,而不是检查整个文件中是否存在名称或密码。如果两个用户拥有相同的密码会怎样?如果您只是在整个文件中搜索单个字符串,则无法确保密码对于给定的用户名是否正确。

例如,假设您的文件看起来像这样:

username1,password1
username2,password2
username3,password3

您的解析代码应该打开并读取文件,并检查包含,而不是每次都搜索整个文件:

users = {}

with open("helloworld.txt") as f3:
    for line in f3:
        name, password = line.split(",")
        users[name] = password.strip()

user = input("Enter login name: ")

if user in users:
    passw = input("Enter password: ")
    print()

    if passw == users[user]:
        print("Login successful!")

    else:
        print("Bad password")

else:
    print("Bad username")

请注意,我已将文件更改为使用context manager(关键字with)。您应该这样做以获得更可靠的资源管理。您还可以通过使字典生成为dictionary comprehension来进行进一步的改进,并且可能通过使用异常来处理字典检查而不是if X in Y

with open("helloworld.txt") as f3:
    pairs = (line.split(",") for line in f3)
    users = {name:password.strip() for name, password in pairs}

user = input("Enter login name: ")
passw = input("Enter password: ")

try:
    if passw == users[user]:
        print("Login successful!")
    else:
        print("Bad password")
except KeyError:
    print("Bad username")

您甚至可以将用户/密码字典创建简化为单一理解,但我认为这会严重妨碍可读性而没有任何好处。

答案 1 :(得分:0)

您遇到问题的原因是:

if user in f3.read() and passw in f3.read():

当您第一次使用f3.read()时,它会将指针移动到结尾,而您无法重新打开它而无法再次阅读。

因此,您可以在第一次阅读文件时阅读并解析它,如下所示:

import ast
# since you're storing the credentials in a dict format
# ast.literal_eval can be used to parse the str to dict
creds = ast.literal_eval(f3.read())
if user in creds and creds[user] == passw:
    #login success 

在不重新打开文件内容的情况下重新读取文件内容的另一种方法是在调用f3.seek(0)之前调用f3.read()。这会将指针移动再次启动,但上述情况更适合你的情况。

答案 2 :(得分:0)

最好使用"使用"当您将数据读入和写入文件时,语句如下:

with open("helloworld.txt","r") as f3:
    # Read user data
    user_data = f3.read()

    # Verify username and password are right

with语句提供更好的异常处理并自动关闭文件并进行必要的清理