zoukankan      html  css  js  c++  java
  • 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 " % ( 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 " % ( 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: %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 "33[31m请输入数值类型,重新输入!33[0m"
                continue
            except (KeyboardInterrupt,EOFError):
                sys.exit("
    33[31m程序退出33[0m")
    
            if save <= 0:
                print "33[31m请输入一个大于0的存款金额:33[0m"
                continue
    
    
            while 1:
                try:
                    comment = str(raw_input("请输入存款信息: "))
                except (KeyboardInterrupt,EOFError):
                    sys.exit("
    33[31m程序退出33[0m")
                if not comment:
                    continue
                break
            break
        balance = rekcon_balance(save,cost)
        a.write('%-12s%-12s%-12s%-12s%-12s
    ' %(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 "33[31m请输入数值类型,重新输入!!!33[0m"
                continue
            except (KeyboardInterrupt,EOFError):
                sys.exit("
    33[31m程序退出33[0m")
    
            if cost <= 0:
                print "33[31m请输入一个大于0的消费金额:33[0m"
                continue
            break
    
        balance = rekcon_balance(save,cost)
        while balance == -1:
            print "33[31m余额不足,请充值或进行其他操作!!!33[0m"
            break
        else:
            while 1:
                try:
                    comment = str(raw_input("请输入消费信息: "))
                except (KeyboardInterrupt,EOFError):
                    sys.exit("
    33[31m程序退出33[0m")
                if not comment:
                    continue
                break
            a.write('%-12s%-12s%-12s%-12s%-12s
    ' %(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 "33[31m初始账户余额:33[0m¥%s" % balance
        else:
            print "33[31m当前账户余额:33[0m¥%s" % balance
    
    
    def view():
        print '账户金额详细信息'.center(78,'*')
        print "%-12s%-12s%-12s%-12s%-12s
    " %('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 = """33[32m-----------------------------
    (0): save money
    (1): cost money
    (2): balance 
    (3): view detail
    (4): quit
    -----------------------------33[0m
    Please Input Your Choice: """
        while 1:
            try:
                choice = raw_input(prompt).strip()[0]
            except (KeyboardInterrupt,EOFError):
                sys.exit("
    33[31m程序退出33[0m")
            except IndexError:
                print "33[31m无效输入,请重新输入!!!33[0m"
                continue
    
            if choice not in '01234':
                print "33[31m无效输入,请重新输入!!!33[0m"
                continue
    
            if choice == 4:
                break
    
            cmds[choice]()
    
    
    if __name__ == '__main__':
        a = open('account.txt','a')
        print show_menu()
        a.close()
  • 相关阅读:
    TCP和UDP的主要特点
    C++ this和*this的区别
    C++空类中含有哪些默认的函数
    const关键字的用途
    哪些函数不能成为虚函数?
    C++是不是类型安全带的?
    多线程 测试
    多线程 采用三个线程 依次数到75
    多线程 实现控制台打印“我爱你”10遍
    多线程 创建子父线程 保证一件事 子线程执行三次后 父线程执行5次 循环10次
  • 原文地址:https://www.cnblogs.com/xkops/p/6257026.html
Copyright © 2011-2022 走看看