You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Pickle在Python密码系统中保存多个数据项?

问题描述

我正在尝试用Python构建一个密码系统,但不知道如何用pickle保存多个数据项。目前代码只能保存单个项(比如用户名),添加密码时会覆盖原有数据,导致功能失效。我尝试了一段代码(意外运行成功),相关代码如下:

import pickle
startup = input('new username or log in? ')
if startup == 'new':
                username = input('username ')
                
 
                class MyClass():
                    def __init__(self, param):
                        self.param = param
 
                def save_object(obj):
                    try:
                        with open("data.pickle", "wb") as f:
                            pickle.dump(obj, f, protocol=pickle.HIGHEST_PROTOCOL)
                    except Exception as ex:
                        print("Error during pickling object (Possibly unsupported):", ex)
 
                obj = MyClass(username)
                save_object(obj)

                
                password = input('password ')
                
 
                class MyClass():
                    def __init__(self, param):
                        self.param = param
 
                def save_object(obj):
                    try:
                        with open("data.pickle", "wb") as f:
                            pickle.dump(obj, f, protocol=pickle.HIGHEST_PROTOCOL)
                    except Exception as ex:
                        print("Error during pickling object (Possibly unsupported):", ex)
 
                obj = MyClass(password)
                save_object(obj)

if startup == 'login':
    
 
    class MyClass():
        def __init__(self, param):
            self.param = param
 
    def load_object(filename):
        try:
            with open(filename, "rb") as f:
                return pickle.load(f)
        except Exception as ex:
            print("Error during unpickling object (Possibly unsupported):", ex)
 
    obj = load_object("data.pickle")
 
    loginuser = (obj.param)

    attemptuser = input('username: ')

    if attemptuser == loginuser:

        class MyClass():
            def __init__(self, param):
                self.param = param
 
    def load_object(filename):
        try:
            with open(filename, "rb") as f:
                return pickle.load(f)
        except Exception as ex:
            print("Error during unpickling object (Possibly unsupported):", ex)
 
    obj = load_object("data.pickle")
 
    loginpassword = (obj.param)


    attemptpassword = input('password: ')

    if attemptpassword == loginpassword:
            print('sucesfully logged in')
解决方案

核心问题是每次用pickle.dump()时都以wb(写入二进制)模式打开文件,这会清空原有内容并写入新数据,导致密码覆盖用户名。以下是优化后的实现:

优化思路

  1. 用单个对象存储完整用户信息(用户名+密码),一次性完成保存
  2. 统一定义类和工具函数,避免重复代码
  3. 处理文件不存在的异常,给出明确提示

优化后代码

import pickle

# 统一定义用户类,同时存储用户名和密码
class User:
    def __init__(self, username, password):
        self.username = username
        self.password = password

# 保存用户数据
def save_user(user):
    try:
        with open("user_data.pickle", "wb") as f:
            pickle.dump(user, f, protocol=pickle.HIGHEST_PROTOCOL)
        print("注册成功")
    except Exception as ex:
        print("保存数据出错:", ex)

# 加载用户数据
def load_user():
    try:
        with open("user_data.pickle", "rb") as f:
            return pickle.load(f)
    except FileNotFoundError:
        print("未找到用户数据,请先注册")
    except Exception as ex:
        print("加载数据出错:", ex)
    return None

# 主逻辑
startup = input("输入new注册,输入login登录: ").strip().lower()

if startup == 'new':
    username = input("请输入用户名: ").strip()
    password = input("请输入密码: ").strip()
    new_user = User(username, password)
    save_user(new_user)
elif startup == 'login':
    user = load_user()
    if not user:
        exit()
    attempt_user = input("请输入用户名: ").strip()
    if attempt_user == user.username:
        attempt_pwd = input("请输入密码: ").strip()
        if attempt_pwd == user.password:
            print("登录成功")
        else:
            print("密码错误")
    else:
        print("用户名错误")
else:
    print("输入无效,请输入new或login")

关键说明

  • 用User类封装用户名和密码,一次dump即可保存完整用户信息,避免覆盖
  • 类和工具函数只定义一次,减少冗余代码
  • 登录时先判断文件是否存在,避免无数据时的报错
  • 如果需要支持多用户,可以将用户信息存储在字典中(格式如{用户名: 密码}),再保存整个字典对象

内容的提问来源于stack exchange,提问作者DiamondDotZip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 20:35:05