廢話不多說,直接上代碼
經驗:dumps和loads是在內存中轉換(python對象和json字符串之間的轉換),而dump和load則是對應於文件的處理.如果需要用到比如提取文件中存入的字典,就需要用json.loads來將str化的字典轉化爲json能接受的json字符串,接收之後,返回的就是python字典
ps:這個坑我踩過一次了,大家引以爲戒.
對了,附上moda(讀寫模式)的差別:r+如果不進行讀操作,會從文檔起始位置開始寫入,並會覆蓋原始文本;a+永遠是追加在文本在文檔最後面。w+則會清空原始文本,清空後就跟a+的行爲相同了。a+和w+在打開文件不存在的情況下能創建新文檔,而r+則報錯。(轉載於https://blog.csdn.net/pzjzeason/article/details/79972658詳情點擊)
'''
ATM系統
卡:卡號,密碼,金額,鎖
用戶:name,iscard,phonenum,card
ATM系統:
屬性:用戶列表 登錄狀態
行爲: 1.登陸 2.開戶 3.查詢 4.取款 5.存款 0.退出
6.轉賬 7.改密 8.鎖卡 9.解鎖
使用json進行持久化處理
'''
import random
import json
#用戶的一切操作都需要通過ATM類
class ATM:
# userMessage={} #key: name='' value: [phonenum='',cardId=[]]
# cardMessage={} #key: carId='' value: [password='',money=0,freeze=True,userName='']
nowUser='' #當前系統用戶
nowCard=''
lock=[False,3]
def __init__(self):
ATM.nowUser=''
ATM.nowCard = ''
Card.nowCardId=''
ATM.lock=[False,3]
def login(self):
cardId = input("請輸入你的卡號\n")
if Card.isExist(cardId) and Card.ifLock(cardId):
if Card.isRight(cardId):
ATM.nowUser=Card.cardMessage[cardId][-1]
ATM.nowCard=cardId
Card.nowCardId=cardId
print('你已經成功登入ATM')
else:
if ATM.lock[1]<=0:
ATM.lock[1]-=1
print('密碼錯誤,當前可繼續輸入密碼次數爲%d'%self.lock[1])
self.login()
else:
Card.cardMessage[cardId][-2]=False
print('此卡已凍結')
else:
print('卡號不存在')
def loginOut(self):
print(ATM.nowCard)
print(ATM.nowUser)
print(Card.nowCardId)
print(Card.cardMessage)
print(Men.userMessage)
ATM.nowUser = ''
ATM.nowCard = ''
Card.nowCardId = ''
ATM.lock = [False, 3]
try:
with open('cardMessage.txt', 'a+', encoding='GBK') as card:
json.dump(Card.cardMessage,card,ensure_ascii=False)
with open('userMessage.txt', 'a+', encoding='GBK') as user:
json.dump(Men.userMessage,user,ensure_ascii=False)
except:
print("持久化失敗")
print("結束")
def creatNewUser(self):
userName=input("請輸入新開戶的用戶名\n")
if Men.ifNewUser(userName):
phoneNumber=input("請輸入電話號碼\n")
men=Men()
men.addUser(userName,phoneNumber)
else:
print("用戶名重複,請重新輸入")
self.creatNewUser()
def selectUser(self):
print(Men.select(ATM.nowUser))
def getMoney(self):
money=int(input("請輸入取錢數\n"))
if money>Card.cardMessage[ATM.nowCard][1]:
print("取的數目大於當前用戶的存款金額,請重新輸入")
self.getMoney()
else:
card=Card()
card.getMoney(money)
def inMoney(self):
money=int(input("請輸入存錢數\n"))
card=Card()
card.inMoney(money)
def Transfer_accounts(self):
cardId=input("請輸入轉賬的賬戶\n")
if cardId in Card.cardMessage:
money=int(input('請輸入轉賬的錢數\n'))
if money<Card.cardMessage[ATM.nowCard][1]:
card=Card.Transfer_accounts(money,cardId)
else:
print("當前賬戶的餘額不足\n")
else:
print('不存在此卡號,請重新輸入')
self.Transfer_accounts()
def changePasswd(self):
if ATM.nowUser=='' and ATM.nowCard=='':
print('當前未登錄')
else:
card=Card()
card.changePasswd()
def lockCard(self):
if ATM.nowUser == '' and ATM.nowCard == '':
print('當前未登錄')
else:
card=Card()
card.lockCard()
def unlock(self):
if ATM.nowUser == '' and ATM.nowCard == '':
print('當前未登錄')
else:
card=Card()
card.unlockCard()
@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
#生成新的卡號 查詢卡號是否存在
class Card:
# cardMessage = {'123':['123',10,True,'沙雕']} # key: carId='' value: [password='',money=0,freeze=True,userName='']
cardMessage={}
nowCardId=''
addNewUser=''
#申請新卡之前,必須有賬戶,userName
# def creat(self,userName):
# newCard=self.creatNewCard()
# print("你的卡號爲%S,請牢記"%newCard)
# self.cardMessage[newCard]=[self.setPasswd(),0,True,userName]
# return newCard
def addCard(self):
newCard=self.creatNewCard()
print("你的卡號爲%s,請牢記" % newCard)
Card.cardMessage[newCard] = [self.setPasswd(), 0, True,self.addNewUser ]
print(Card.cardMessage)
return newCard
def creatNewCard(self):
newCard = ''
for a in range(6):
newCard += str(random.randint(1, 6))
if self.isExist(newCard):
self.creatNewCard()
else:
return newCard
@classmethod
def isExist(cla,cardId):
if cardId in Card.cardMessage:
return True
else:
return False
@classmethod
def isRight(cla,cardId):
if input("請輸入該卡的密碼\n")==cla.cardMessage[cardId][0]:
return True
else:
return False
def setPasswd(self,*args):
if args==():
passwd=input("請輸入密碼\n")
return passwd
else:
passwd = input("請輸入重置的密碼\n")
Card.cardMessage[Card.nowCardId][0]=passwd
def changePasswd(self):
self.setPasswd(Card.nowCardId)
@classmethod
def ifLock(self,cardId):
if Card.cardMessage[cardId][-2]:
return True
else:
return False
def lockCard(self):
# if Card.cardMessage[cardId][-2]:
Card.cardMessage[Card.nowCardId][-2]=False
print("凍結成功\n")
# else:
# print("該卡已凍結\n")
def unlockCard(self):
# if Card.cardMessage[cardId][-2]:
# print("該卡已解凍,無需再解凍\n")
# else:
Card.cardMessage[Card.nowCardId][-2]=True
print("解凍成功\n")
def getMoney(self,money):
Card.cardMessage[Card.nowCardId][1]-=money
print('取款成功')
def inMoney(self,money):
Card.cardMessage[Card.nowCardId][1]+=money
print('存款成功')
def Transfer_accounts(self,money,card2):
#轉賬功能實現
try:
Card.cardMessage[Card.nowCardId][1]-=money
Card.cardMessage[card2][1]+=money
print("轉賬成功")
except:
print("轉賬失敗")
class Men:
# userMessage = {'沙雕': ["1", "123"]} # key: name='' value: [phonenum='',cardId=[]]
userMessage = {}
def addUser(self,newUserName,phonenum):
card=Card()
Card.addNewUser=newUserName
Men.userMessage[newUserName]=[phonenum,card.addCard()]
@classmethod
def select(self,nowUserName):
return Men.userMessage[nowUserName]
@classmethod
def ifNewUser(cla,userName):
if userName in cla.userMessage:
return False
else:
return True
if __name__ == '__main__':
ATM.welcome()
atm=ATM()
#dumps和loads是在內存中轉換(python對象和json字符串之間的轉換),而dump和load則是對應於文件的處理。
try:
with open(file=r'C:\Users\Administrator\PycharmProjects\workhard\venv\Include\day12\cardMessage.txt',mode='r',encoding='GBK') as card:
# print(card)
# print(type(card.read()))
# print(type(card))
cardmessage=card.read()
cardmessage.replace("'",'''"''')
print(cardmessage)
Card.cardMessage=json.loads(cardmessage)
print(Card.cardMessage)
with open(file=r'C:\Users\Administrator\PycharmProjects\workhard\venv\Include\day12\userMessage.txt',mode='r',encoding='GBK') as user:
usermessage=user.read()
usermessage.replace("'",'''"''')
print(usermessage)
Men.userMessage=json.loads(usermessage)
print(Men.userMessage)
except:
print("讀取文件錯誤")
while 1:
nun=ATM.select()
if nun=='1':
atm.login()
elif nun=='2':
atm.creatNewUser()
elif nun=='3':
atm.selectUser()
elif nun=='4':
atm.getMoney()
elif nun=='5':
atm.inMoney()
elif nun=='0':
atm.loginOut()
elif nun=='6':
atm.Transfer_accounts()
elif nun=='7':
atm.changePasswd()
elif nun=='8':
atm.lockCard()
elif nun=='9':
atm.unlock()
else:
print("無效操作")