目標:
1.使用序列化cPickle
2.賬戶中錢要大於花費的錢,否則提示請存錢
2.編寫函數,實現存錢,花錢,查詢及退出功能
1.序列化
pickle是python實現序列化的模塊,次模塊存在使用C語言編寫模塊,用法相同,但執行效率更高,所以優先使用C模塊編寫的序列化模塊cPickle。
2.編寫函數,實現存錢,花錢,查詢及退出功能
代碼如下:
[root@localhost python]# cat new_account.py
#!/usr/bin/env python # -*- coding: utf-8 -*- import os,time import cPickle as p
def save_money(wallet, record, amount, comment): date = time.strftime("%Y-%m-%d") with open(wallet) as fobj: balance = p.load(fobj) + amount with open(wallet, 'wb') as fobj: p.dump(balance, fobj) with open(record, 'a') as fobj: fobj.write( "%-12s%-8s%-8s%-10s%-20s\n" % ( date, 'N/A', amount, balance, comment ) ) def cost_money(wallet, record, amount, comment): date = time.strftime("%Y-%m-%d") with open(wallet) as fobj: balance = p.load(fobj) - amount if balance < 0: print "余額不足,請先存錢或進行其他操作!" else: with open(wallet, 'wb') as fobj: p.dump(balance, fobj) with open(record, 'a') as fobj: fobj.write( "%-12s%-8s%-8s%-10s%-20s\n" % ( date, amount, 'N/A', balance, comment ) ) def query_money(wallet, record): print "%-12s%-8s%-8s%-10s%-20s" % ( 'date', 'cost', 'save', 'balance', 'comment' ) with open(record) as fobj: for line in fobj: print line, with open(wallet) as fobj: print "New Balance:\n%s" % p.load(fobj) def show_menu(): w_file = 'wallet.data' r_file = 'record.txt' cmds = { '0': save_money, '1': cost_money, '2': query_money } prompt = """(0) save money (1) spend money (2) query detail (3) quit Please input your choice(0/1/2/3): """ if not os.path.isfile(w_file): with open(w_file, 'w') as fobj: p.dump(0, fobj) if not os.path.isfile(r_file): os.mknod(r_file) while True: args = (w_file, r_file) choice = raw_input(prompt).strip()[0] if choice not in '0123': print "Invalid input, Try again." continue if choice in '01': amount = int(raw_input("Amount: ")) comment = raw_input("Comment: ") args = (w_file, r_file, amount, comment) if choice == '3': break cmds[choice](*args) if __name__ == '__main__': print show_menu()
•運行代碼,測試效果
[root@localhost python]# python new_account.py (0) save money (1) spend money (2) query detail (3) quit Please input your choice(0/1/2/3): 2 date cost save balance comment New Balance: 0 (0) save money (1) spend money (2) query detail (3) quit Please input your choice(0/1/2/3): 1 Amount: 100 Comment: cost 100 余額不足,請先存錢或進行其他操作! (0) save money (1) spend money (2) query detail (3) quit Please input your choice(0/1/2/3): 0 Amount: 100 Comment: save 100 (0) save money (1) spend money (2) query detail (3) quit Please input your choice(0/1/2/3): 2 date cost save balance comment 2017-01-06 N/A 100 100 save 100 New Balance: 100 (0) save money (1) spend money (2) query detail (3) quit Please input your choice(0/1/2/3): 1 Amount: 101 Comment: cost 101 余額不足,請先存錢或進行其他操作! (0) save money (1) spend money (2) query detail (3) quit Please input your choice(0/1/2/3): 1 Amount: 100 Comment: cost 100 (0) save money (1) spend money (2) query detail (3) quit Please input your choice(0/1/2/3): 2 date cost save balance comment 2017-01-06 N/A 100 100 save 100 2017-01-06 100 N/A 0 cost 100 New Balance: 0 (0) save money (1) spend money (2) query detail (3) quit Please input your choice(0/1/2/3):
*附錄
1.如下是自己初次編寫的代碼,函數不具備通用性功能。
#!/usr/bin/env python #coding:utf8 import os,sys import time ''' 1.運行該腳本會生成一個balance.txt文件,並設置初始賬戶余額:¥10000 2.運行該腳本會生成一個account.txt文件,並記錄賬戶消費信息詳情。 ''' def save(): date = time.strftime("%Y-%m-%d") cost = 0 while 1: try: save = int(raw_input("請輸入存款金額: ").strip()) except ValueError: print "\033[31m請輸入數值類型,重新輸入!\033[0m" continue except (KeyboardInterrupt,EOFError): sys.exit("\n\033[31m程序退出\033[0m") if save <= 0: print "\033[31m請輸入一個大於0的存款金額:\033[0m" continue while 1: try: comment = str(raw_input("請輸入存款信息: ")) except (KeyboardInterrupt,EOFError): sys.exit("\n\033[31m程序退出\033[0m") if not comment: continue break break balance = rekcon_balance(save,cost) a.write('%-12s%-12s%-12s%-12s%-12s\n' %(date, cost, save, balance, comment)) a.flush() with open('balance.txt', 'w') as b: balance = str(balance) b.write(balance) def cost(): save = 0 date = time.strftime("%Y-%m-%d") while 1: try: cost = int(raw_input("請輸入消費金額: ").strip()) except ValueError: print "\033[31m請輸入數值類型,重新輸入!!!\033[0m" continue except (KeyboardInterrupt,EOFError): sys.exit("\n\033[31m程序退出\033[0m") if cost <= 0: print "\033[31m請輸入一個大於0的消費金額:\033[0m" continue break balance = rekcon_balance(save,cost) while balance == -1: print "\033[31m余額不足,請充值或進行其他操作!!!\033[0m" break else: while 1: try: comment = str(raw_input("請輸入消費信息: ")) except (KeyboardInterrupt,EOFError): sys.exit("\n\033[31m程序退出\033[0m") if not comment: continue break a.write('%-12s%-12s%-12s%-12s%-12s\n' %(date, cost, save, balance, comment)) with open('balance.txt', 'w') as b: balance = str(balance) b.write(balance) a.flush() def rekcon_balance(save,cost): try: with open('balance.txt', 'r') as b: balance = b.readline() balance = int(balance) except IOError: balance = 10000 balance += save if cost > balance: balance = -1 return balance balance -= cost # with open('balance.txt', 'w') as f: # balance = str(balance) # f.write(balance) return balance def balance(): try: with open('balance.txt', 'r') as b: balance = b.readline() except IOError,e: balance = 10000 print "\033[31m初始賬戶余額:\033[0m¥%s" % balance else: print "\033[31m當前賬戶余額:\033[0m¥%s" % balance def view(): print '賬戶金額詳細信息'.center(78,'*') print "%-12s%-12s%-12s%-12s%-12s\n" %('Date', 'Cost', 'Save', 'Balance', 'Comment'), with open('account.txt','r') as b: for line in b.readlines(): print line, print '*'.center(70,'*') def show_menu(): cmds = { '0': save, '1': cost, '2': balance, '3': view, '4': quit } prompt = """\033[32m----------------------------- (0): save money (1): cost money (2): balance (3): view detail (4): quit -----------------------------\033[0m Please Input Your Choice: """ while 1: try: choice = raw_input(prompt).strip()[0] except (KeyboardInterrupt,EOFError): sys.exit("\n\033[31m程序退出\033[0m") except IndexError: print "\033[31m無效輸入,請重新輸入!!!\033[0m" continue if choice not in '01234': print "\033[31m無效輸入,請重新輸入!!!\033[0m" continue if choice == 4: break cmds[choice]() if __name__ == '__main__': a = open('account.txt','a') print show_menu() a.close()