python可以解释文本文件中的列表吗?

时间:2016-04-17 04:28:17

标签: python list file

我正在尝试建立密码管理员,并且我在文本文件中拥有用户帐户的用户名和密码。但是,由于脚本想要知道loginUser和loginPass的用户输入是否在文件中,这为用户创建了使用不匹配的用户名和密码登录的机会。我可以创建一个列表(或至少一对字符串)并检查登录变量的输入是否在特定列表中?

这是我的代码如果您想自己测试一下:

def title():
    # This is the title screen
    print('____This is a password keeper____')
    main()


def main():
    abc = open("userpassfile.txt", "r+")
    userpassfile = abc.read().strip().split()
    actCheck = input('Do you already have an account?')
    if(actCheck == 'Yes' or actCheck == 'yes'):
        loginUser = input('What is your username?')
        loginPass = input('What is yout password?')
        if(loginUser and loginPass in userpassfile):
            dirCheck = input('Account Settings? [y/n]')
            if(dirCheck == 'y' or dirCheck == 'Y'):
                print('This function is not working yet!')
            else:
                print('hihi')
        else:
            print('Incorrect password or username!')
    else:
        createAct = input('would you like to create one?')
        if (createAct == 'Yes' or createAct == 'yes'):
            createUser = input('What would you like your username to be?:')
            createPass = input('What would you like your password to be?:')
            abc.write(createUser + '\n')
            abc.write(createPass + '\n')
            open(createUser + '.txt', "w")

title()

如果您对我的代码有任何疑问,请询问!谢谢!

1 个答案:

答案 0 :(得分:1)

对我来说,将用户/传递对存储在一行中会更有意义。像

这样的东西
user:pass

或者

user|pass

这种方法的问题在于消除了用作用户名或密码的字符(用作分隔符的字符)。为了解决这个限制,您可以执行类似于字符串协议的工作方式,并在该行前面加上代表用户名长度的数字。

004userpass
014longerusernamepassword

您将前3个字符作为整数读取,并知道为用户读取了多少字符以及密码的数量。

当然你也可以用json,yaml或csv等其他几种格式存储它,

鉴于您将它们存储在成对的行中,您应该能够将它们分解为具有与此类似的代码的组:

f = """username1
password1
username2
password2""".splitlines()

pairs = [tuple(f[i*2:i*2+2]) for i in range(len(f)/2)]
print(pairs)

这将输出:

[('username1', 'password1'), ('username2', 'password2')]

然后你只需检查

if (loginUser, loginPass) in pairs:
    ...

您可以使用更通用的方法将用户名/密码列表分成对,也可以使用此功能

def groups(inval, size):
    for i in range(0, len(inval), size):
        yield inval[i:i+size]

然后你可以做

pairs = tuple(groups(f, 2))