python写一个很简单的Atm机系统,使用pickle模块和json模块来保存数据

我做的是一个很简单的Atm系统,很多都没约束条件

目的:

  • 用面向对象思维来处理
  • 运用文件的读写
    文件的读写用pickle模块和json模块来处理

pickle模块:

  • pickle模块处理数据功能很强大,但是弊端不同版本的python解释器不兼容
    pickle模块功能:
  • pickle.dumps(obj) 功能:将指定的对象序列化
  • pickle.dump(obj,f) 功能:将指定的对象序列化并写入到打开的文件中
  • pickle.loads(f2.read()) 功能:将二进制的字符串反序列化为对象
  • pickle.load(f2) 功能:读取打开的文件对象,并且将读取到的内容反序列化为对象

json模块的功能:

  • json模块处理数据也强大,但是需要自定义方法来进行数据的转换。(python的特殊数据类型)

  • json可以直接序列化python基本数据类型。

  • json.dumps(obj,default) 注意:若obj为python基本数据类型,我们无需写default,直 接进行序列化
    若obj为自定义的数据类型,这时候default后面跟的是将对象转为基本数据类型的函数
    功能:将obj使用default函数转为字典并且序列化为json字符串,并且返回

  • json.dump(obj,f,default) 功能:将obj使用default函数转为字典并且序列化为json字符串,
    并且写入到指定的打开的f中。

  • json.loads(jsonstr,object_hook)
    功能:将jsonstr转为字典,通过object_hook的方法将字典转为对象

  • json.load(f,object_hook) 功能:读取打开文件的内容,并且将读取的内容转为字典,
    通过object_hook的方法将字典转为对象。 本系统用了pickle模块也用了json模块

我的写的数据类型是 dict = { “卡号”:对象数据类型}
下面是pickle模块来读写:

         #读
         try:
            with open("user.txt","rb") as f:
                 ATM.userDict = pickle.load(f)
         except:
             pass
         #写
         with open("user.txt","wb") as f1:
             pickle.dump(ATM.userDict,f1)

下面用json模块来读写

def aa1dict(a): 
    a_a = {"name":a.name,"idcard":a.idcard,"phonenum":a.phonenum,"cardnum":a.card.cardnum,"psd":a.card.password,"mon":a.card.money,"islock":a.card.islock}
    return a_a
#
def dictaa(d):
    a_aa = Card(d["cardnum"],d["psd"],d["mon"],d["islock"])
    a_b = User(d["name"],d["idcard"],d["phonenum"],a_aa)
    return a_b

#读
    try:
        with open("xxx.txt", "r", encoding="utf-8") as f:
            for line in f.readlines():
                obj = json.loads(line, object_hook=dictaa)
                ATM.userDict[obj.card.cardnum]=obj
#写
     with open("xxx.txt","w",encoding="utf-8") as f1:
          for i in ATM.userDict:
          str1 = json.dumps(ATM.userDict.get(i), default=aa1dict)
          f1.write(str1 + "\n")

本系统主要是这养一个界面:


           *  1.登陆   2.开户    *
           *  3.查询   4.取款    *
           *  5.存款   0.退出    *
           *  6.转账   7.改密    *
           *  8.锁卡   9.解锁    *
           **********************

下面是完整代码:
Atm类

    import time
    import pickle
    import json
    
    class ATM:
        
            userDict={}
            islogin = None
    
        @staticmethod
        def welcome():
            print('''
               **********************
               *                    *
               *  welcome to bank   *
               *                    *
               **********************
               ''')
    
        @staticmethod
        def select():
            print('''
               **********************
               *  1.登陆   2.开户    *
               *  3.查询   4.取款    *
               *  5.存款   0.退出    *
               *  6.转账   7.改密    *
               *  8.锁卡   9.解锁    *
               **********************
               ''')
            num = input("请选择服务项目:")
            return num
    
        # @staticmethod #随机卡号
        def getcardnum(self):
            cardnum = ""
            for x in range(6):
                cardnum += str(random.randrange(0, 10))
            while 1:
                shfblw = 0
                for i in self.userDict:
                    if i == cardnum:
                        shfblw = 1
                        cardnum = ""
                        for x in range(6):
                            cardnum += str(random.randrange(0, 10))
                        break
                if shfblw == 0:
                    break
            return cardnum
    
        # 开户
        # @classmethod
        def openUser(self):
            name = input("请输入您的姓名:")
            idcard = input("请输入您的身份证号码:")
            phonenum = input("请输入您的电话号码:")
            psd = input("请设置您的密码:")
            psd2 = input("请确认您的密码:")
            if psd == psd2:
                mon = int(input("请输入您的预存余额:"))
                if mon>0:
                    cardnum = self.getcardnum()
                    card = Card(cardnum,psd,mon)
                    user = User(name,idcard,phonenum,card)
                    self.userDict[cardnum] = user
                    print("开卡成功,您的卡号为%s,请牢记..."%cardnum)
    
                else:
                    print("预存余额非法,开卡失败...")
    
            else:
                print("两次输入密码不一致,开卡失败...")
    
        # 登入
        @classmethod
        def login(cls):
            cardnum = input("请输入您的卡号:")
            user = cls.userDict.get(cardnum)
            if user:
                print(not(cls.userDict.get(cardnum).card.islock))
                if not(cls.userDict.get(cardnum).card.islock):
                    psd = input("请输入您的密码:")
                    csss = 0
                    while 1:
                        if psd == user.card.password:
                            print("恭喜你,登录成功!!!")
                            cls.islogin = cardnum
                            break
                        else:
                            csss += 1
                            if csss == 3:
                                print("密码输入错误次数过多,该卡已锁")
                                cls.userDict.get(cardnum).card.islock =True
                                break
                            psd = input("密码错误,请输入您的密码:")
                else:
                    print("改卡已锁,请解锁后登入")
            else:
                print("卡号不存在,请查证后登录。。。")
    
        #查询
        @classmethod
        def search(cls):
            print(cls.islogin)
            if cls.islogin:
                print("您当前的余额为%d" % (cls.userDict.get(cls.islogin).card.money))
            else:
                print("请登录后查询")
        #取款
        def withdrawal(self):
            if self.islogin:
                yuee = self.userDict.get(self.islogin).card.money
                print("您当前的余额为%d" %yuee)
                qukan = int(input("请输入取款金额:"))
                if 0 <= qukan <= yuee:
                    print("已成功取款")
                    self.userDict.get(self.islogin).card.money -= qukan
                else:
                    print("输入有误,取款失败")
            else:
                print("请登录后取款")
    
        # 存款
        def deposit(self):
            if self.islogin:
                yuee = self.userDict.get(self.islogin).card.money
                print("您当前的余额为%d" % yuee)
                cunkan = int(input("请输入存款金额:"))
                if 0 <= cunkan:
                    print("已成功存款")
                    self.userDict.get(self.islogin).card.money += cunkan
                else:
                    print("输入有误,存款失败")
            else:
                print("请登录后存款")
    
        #转账
        def transfer(self):
            if self.islogin:
                yue = self.userDict.get(self.islogin).card.money
                print("您当前的余额为%d" %yue)
                zzid = input("请输入转入的账号:")
                if zzid != self.islogin:
                    for i in self.userDict:
                        if i == zzid:
                            zzje = int(input("请输入转账金额:"))
                            if zzje >=0 and zzje <= yue:
                                print("转账成功")
                                self.userDict.get(self.islogin).card.money -= zzje
                                self.userDict.get(zzid).card.money += zzje
                            else:
                                print("输入有误,转账失败")
                            break
                    else:
                        print("请查证后再进行转账")
                else:
                    print("不能转账给自己,转账失败")
            else:
                print("请登录后转账")
    
        #改密
        def close(self):
            if self.islogin:
                # print("您当前的余额为%d" % (self.userDict.get(self.islogin).card.money))
                ylmm = input("请输入原密码")
                if ylmm == self.userDict.get(self.islogin).card.password:
                    xzmm = input("请输入现密码:")
                    xzmm1 = input("请再次输入现密码:")
                    if xzmm == xzmm1:
                        print("改密成功")
                        self.userDict.get(self.islogin).card.password = xzmm
                    else:
                        print("两次密码不一致,改密失败")
                else:
                    print("密码错误,改密失败")
    
            else:
                print("请登录后改密")
        #锁卡
        def lock(self):
            print(self.islogin)
            if self.islogin:
                if self.userDict.get(self.islogin).card.islock == False:
                    print("是否确认锁卡---1.是----2.否")
                    sfqr = input("请输入是否的代表数字:")
                    if sfqr == "1":
                        print("锁卡成功")
                        self.userDict.get(self.islogin).card.islock = True
                        print("退出登入...")
                        self.islogin = None
                    else:
                        print("锁卡失败")
                else:
                    print("该卡已锁")
            else:
                print("请登录后锁卡")
    
            print(self.islogin)
    
        #解锁
        def unlock(self):
            jkid = input("请输入解锁的卡号")
            for i in self.userDict:
                if i == jkid:
                    if self.userDict.get(jkid).card.islock:
                        jsmm = input("请输入该卡密码")
                        if jsmm == self.userDict.get(jkid).card.password:
                            print("解锁成功")
                            self.userDict.get(jkid).card.islock = False
                        else:
                            print("密码错误,解锁失败")
                    else:
                        print("该卡未被锁")
                    break
            else:
                print("输入有误,解锁失败")

Card类

    class Card:
        def __init__(self,cardnum,password,money,islock=False):
            self.cardnum = cardnum
            self.password = password
            self.money = money
            self.islock =islock

User类

    class  User():
    
        def __init__(self,name,idcard,phonenum,card):
            self.name = name
            self.idcard = idcard
            self.phonenum = phonenum
            self.card = card

运行:

    def aa1dict(a):
        a_a = {"name":a.name,"idcard":a.idcard,"phonenum":a.phonenum,"cardnum":a.card.cardnum,"psd":a.card.password,"mon":a.card.money,"islock":a.card.islock}
        return a_a
    #
    def dictaa(d):
        a_aa = Card(d["cardnum"],d["psd"],d["mon"],d["islock"])
        a_b = User(d["name"],d["idcard"],d["phonenum"],a_aa)
        return a_b
    
    if __name__ == '__main__':
        ATM.welcome()
        aa = ATM()
        #pickle模块读取文件读出来的数据就是写进去的数据不需要转换
        # try:
        #     with open("user.txt","rb") as f:
        #         ATM.userDict = pickle.load(f)
        # except:
        #     pass
        
        #json模块读取数据 需要dictaa()方法来转换
        try:
            with open("xxx.txt", "r", encoding="utf-8") as f:
                for line in f.readlines():
                    obj = json.loads(line, object_hook=dictaa)
                    ATM.userDict[obj.card.cardnum]=obj
        except:
            pass
        while True:
            time.sleep(1)
            print(ATM.userDict)
            num = ATM.select()
            if num == "2":
                print("开户")
                aa.openUser()
            elif num == "0":
                print("退出")
                #pickle模块来写文件 主要pickle写的文件和读的文件都是二进制
                # with open("user.txt","wb") as f1:
                #     pickle.dump(ATM.userDict,f1)
                # break
                
                #json模块写文件  把对象以字典的方式写入               
                with open("xxx.txt","w",encoding="utf-8") as f1:
                    for i in ATM.userDict:
                        str1 = json.dumps(ATM.userDict.get(i), default=aa1dict)
                        f1.write(str1 + "\n")
                break
            elif num == "1":
                print("登录")
                ATM.login()
            elif num == "3":
                print("查询")
                ATM.search()
            elif num == "4":
                print("取款")
                aa.withdrawal()
            elif num == "5":
                print("存款")
                aa.deposit()
            elif num == "6":
                print("转账")
                aa.transfer()
            elif num == "7":
                print("改密")
                aa.close()
            elif num == "8":
                print("锁卡")
                aa.lock()
            elif num == "9":
                print("解锁")
                aa.unlock()
            else:
                print("选择有误请重新选择...")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值