python写一个很简单的Atm机系统,使用pickle模块和json模块来保存数据
2019-07-27 13:55
399 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_35087676/article/details/97495281
我做的是一个很简单的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("选择有误请重新选择...")
相关文章推荐
- python pickle模块使用-将内存数据保存到文本中以及从文本中直接读取信息到内存中
- python数据预处理并使用pickle模块保存
- python数据持久存储:pickle模块的基本使用
- python数据持久存储:pickle模块的基本使用
- python数据持久存储:pickle模块的基本使用
- Python使用内置json模块解析json格式数据的方法
- python数据持久存储:pickle模块的基本使用
- Python中的数据对象持久化存储模块pickle的使用示例
- python数据持久存储:pickle模块的基本使用
- python数据持久存储:pickle模块的基本使用
- python数据持久存储:pickle模块的基本使用
- python 之pickle模块--输出保存到文本(基本的数据序列和反序列化)
- Python数据存储:pickle模块的使用讲解
- python 跨语言数据交互、json、pickle(序列化)、urllib、requests(爬虫模块)、XML。
- [转]python数据持久存储:pickle模块的基本使用
- python数据持久存储:pickle模块的基本使用
- python数据持久存储:pickle模块的基本使用
- python数据持久存储:pickle模块的基本使用
- pickle——保存python中数据结构的模块
- python数据持久存储:pickle模块的使用