您的位置:首页 > 编程语言 > Python开发

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("选择有误请重新选择...")
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: