Python:用户名密码系统的“ ValueError:太多值无法解包(预期2)”

时间:2019-05-28 15:22:29

标签: python dictionary

当文本文件中包含多个键和值时,我正在从文本文件中创建字典时,出现此错误“ ValueError:太多值无法解包(预期2)”。

database = {}  #creates an empty dictionary
with open("file.txt", "r") as infile:  #opens the dictionary
    for line in infile: #for each line
        name, ask = line.strip().split(':') 
        database[name] = (ask)


name = input('Enter username: ')
ask = input('Enter pin: ')
if name in database:
    if ask in database[name]:
        print('Welcome', name)

    else:
        database.update( {name : ask} )
        print(database)
else:
    database.update( {name : ask} )
    print(database)


with open('file.txt', 'w') as file: 
    file.write(json.dumps(database)) #updates the text file with the new databse

我希望程序运行时,无论输入哪个键,文本文件中都有多个键和值可以运行。但是,如果文件中的键/值超过1个,则文本文件无法解压缩

5 个答案:

答案 0 :(得分:1)

检查 file.txt 文件中的所有行。在某些情况下,“:”的出现可能不止一个。既然如此,您要将列表拆成两个变量。如果第4行的结果列表中有两个以上的值,即line.strip()。split(“:”),则会引发异常。

答案 1 :(得分:0)

使用pythons函数eval,您可以将从文件中读取的字符串解析为字典。然后您可以将其写入字典

with open("file.txt", "r") as infile:  #opens the dictionary
    for line in infile: #for each line
        entry = eval(line)
        database[entry["name"]] = entry["man"]

答案 2 :(得分:0)

尝试一下

import ast

with open("file.txt", "r") as infile:  #opens the dictionary
    for line in infile: #for each line
        eval_dict = ast.literal_eval(line) # This gives you a dictionary
        database[name] = eval_dict["name"]

注意:

根据@jaggers评论

我考虑过文本文件中的{"name" : "hello", "man" : "mane"}行。

答案 3 :(得分:0)

您的代码打开文件,然后逐行对其进行迭代。 如果与您对原始问题的评论完全相同,则第一行 为:

 {"name" : "hello", "man" : "mane"}

无法在您的代码中解析。

如果您的文件不是此格式:

"name":"hello"
"man":"mane"

(换行符是隐式的),它将正常工作。

错误似乎是您正在考虑将看起来像Python字典的文本文件自动地由Python解析为字典:不会,这就是为什么您在此处得到其他答案的原因,建议使用eval ()或类似名称为您解析。

您可能要考虑使用json模块读取和写入类似字典的文件。

hth

答案 4 :(得分:0)

为什么不只使用简单的json文件?

with open("file.txt", "r") as infile:
    database = json.loads(infile.read())