修复密码存储程序view函数抛出的ValueError问题
问题:密码管理器view函数抛出ValueError
我跟着教程写了一个带添加、查看、存储密码功能的程序,但每次运行view函数都会抛出ValueError。具体代码和报错信息如下:
代码
from cryptography.fernet import Fernet ''' def write_key(): key = Fernet.generate_key() with open("key.key", "wb") as key_file: key_file.write(key) ''' def load_key(): file = open("key.key", "rb") key = file.read() file.close() return key key = load_key() fer = Fernet(key) def view(): with open('passwords.txt', 'r') as f: for line in f.readlines(): data = line.rstrip() user, passw = data.split("|") print("User:", user, "| Password:",fer.decrypt(passw.encode()).decode()) def add(): name = input('Account Name: ') pwd = input("Password: ") with open('passwords.txt', 'a') as f: f.write(name + "|" + fer.encrypt(pwd.encode()).decode() + "\n") while True: mode = input("Would you like to add a new password or view existing ones (view, add), press q to quit? ").lower() if mode == "q": break if mode == "view": view() elif mode == "add": add() else: print("Invalid mode.") continue
报错输出
Would you like to add a new password or view existing ones (view, add), press q to quit? view --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-18-234bb8d48400> in <module> 35 break 36 if mode == "view": ---> 37 view() 38 elif mode == "add": 39 add() <ipython-input-18-234bb8d48400> in view() 21 for line in f.readlines(): 22 data = line.rstrip() ---> 23 user, passw = data.split("|") 24 print("User:", user, "| Password:",fer.decrypt(passw.encode()).decode()) 25 def add(): ValueError: too many values to unpack (expected 2)
解决方案
这个错误的核心是passwords.txt里的某一行用|分割后,得到的元素数量不是2,没法赋值给user, passw两个变量。以下是具体解决办法:
1. 检查并修复密码文件内容
打开passwords.txt,逐行排查:
- 是否有包含多个
|的行(比如账户名里误输入了|) - 是否有空行或者没有
|的无效行 - 是否存在之前手动写入的不符合
用户名|加密密码格式的内容
把这些异常行删除或修正成正确格式即可。
2. 限制split的分割次数
修改view函数里的split语句,添加maxsplit=1参数,确保只以第一个|为分隔符,就算账户名里包含|也不会出错:
user, passw = data.split("|", 1)
3. 添加异常处理避免崩溃
给view函数加上异常捕获,遇到格式错误的行时跳过并提示,防止程序直接崩溃:
def view(): with open('passwords.txt', 'r') as f: for line in f.readlines(): data = line.rstrip() try: user, passw = data.split("|", 1) print("User:", user, "| Password:", fer.decrypt(passw.encode()).decode()) except ValueError: print(f"跳过格式错误的行: {data}")
内容的提问来源于stack exchange,提问作者Axel Palomino
相关产品推荐
相关产品推荐

