Python实现简单的记账本功能

目标:

  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()

 

posted @ 2017-01-06 17:09  xkops  阅读(6103)  评论(0编辑  收藏  举报