Python实现简单的记账本功能,,目标:  1.使用序


目标:

  1.使用序列化cPickle

  2.账户中钱要大于花费的钱,否则提示请存钱

  2.编写函数,实现存钱,花钱,查询及退出功能

1.序列化

  pickle是python实现序列化的模块,次模块存在使用C语言编写模块,用法相同,但执行效率更高,所以优先使用C模块编写的序列化模块cPickle。

2.编写函数,实现存钱,花钱,查询及退出功能

代码如下:

[[email protected] python]# cat new_account.py

#!/usr/bin/env python# -*- coding: utf-8 -*-import os,timeimport 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) quitPlease 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()

?运行代码,测试效果

[[email protected] python]# python new_account.py(0) save money(1) spend money(2) query detail(3) quitPlease input your choice(0/1/2/3): 2date        cost    save    balance   commentNew Balance:0(0) save money(1) spend money(2) query detail(3) quitPlease input your choice(0/1/2/3): 1Amount: 100Comment: cost 100余额不足,请先存钱或进行其他操作!(0) save money(1) spend money(2) query detail(3) quitPlease input your choice(0/1/2/3): 0Amount: 100Comment: save 100(0) save money(1) spend money(2) query detail(3) quitPlease input your choice(0/1/2/3): 2date        cost    save    balance   comment2017-01-06  N/A     100     100       save 100New Balance:100(0) save money(1) spend money(2) query detail(3) quitPlease input your choice(0/1/2/3): 1Amount: 101Comment: cost 101余额不足,请先存钱或进行其他操作!(0) save money(1) spend money(2) query detail(3) quitPlease input your choice(0/1/2/3): 1Amount: 100Comment: cost 100(0) save money(1) spend money(2) query detail(3) quitPlease input your choice(0/1/2/3): 2date        cost    save    balance   comment2017-01-06  N/A     100     100       save 1002017-01-06  100     N/A     0         cost 100New Balance:0(0) save money(1) spend money(2) query detail(3) quitPlease input your choice(0/1/2/3):

*附录

1.如下是自己初次编写的代码,函数不具备通用性功能。

#!/usr/bin/env python#coding:utf8import os,sysimport time‘‘‘1.运行该脚本会生成一个balance.txt文件,并设置初始账户余额:¥100002.运行该脚本会生成一个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 balancedef 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" % balancedef 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[0mPlease 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()

Python实现简单的记账本功能

评论关闭