[python]關於json讀寫文件的一點小心得(另外附上ATM系統用json進行持久化操作的修改版代碼)

廢話不多說,直接上代碼
經驗: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("無效操作")

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章