目标:

  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 = {
'': save_money,
'': cost_money,
'': 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 '':
print "Invalid input, Try again."
continue if choice in '':
amount = int(raw_input("Amount: "))
comment = raw_input("Comment: ")
args = (w_file, r_file, amount, comment) if choice == '':
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 = {
'': save, '': cost, '': balance, '': view, '': 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 '':
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实现简单的记账本功能的更多相关文章

  1. 完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能

    #!/bin/usr/env python#coding=utf-8'''完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能'''try: a=int(raw_input(" ...

  2. Selenium + PhantomJS + python 简单实现爬虫的功能

    Selenium 一.简介 selenium是一个用于Web应用自动化程序测试的工具,测试直接运行在浏览器中,就像真正的用户在操作一样 selenium2支持通过驱动真实浏览器(FirfoxDrive ...

  3. python实现简单的循环购物车小功能

    python实现简单的循环购物车小功能 # -*- coding: utf-8 -*- __author__ = 'hujianli' shopping = [ ("iphone6s&quo ...

  4. Python django实现简单的邮件系统发送邮件功能

    Python django实现简单的邮件系统发送邮件功能 本文实例讲述了Python django实现简单的邮件系统发送邮件功能. django邮件系统 Django发送邮件官方中文文档 总结如下: ...

  5. python网络编程--socketserver 和 ftp功能简单说明

    1. socketserver 我们之前写的tcp协议的socket是不是一次只能和一个客户端通信,如果用socketserver可以实现和多个客户端通信.它是在socket的基础上进行了一层封装,也 ...

  6. python超简单的web服务器

    今天无意google时看见,心里突然想说,python做web服务器,用不用这么简单啊,看来是我大惊小怪了. web1.py   1 2 3 #!/usr/bin/python import Simp ...

  7. python操作三大主流数据库(6)python操作mysql⑥新闻管理后台功能的完善(增、ajax异步删除新闻、改、查)

    python操作mysql⑥新闻管理后台功能的完善(增.删.改.查)安装表单验证D:\python\python_mysql_redis_mongodb\version02>pip instal ...

  8. python 的排名,已经python的简单介绍

    我在今天看了一篇文章,是简书的全网程序猿写的,Java已经退出神坛,python稳居第一. python是由龟叔写的,它在英文的意思是蟒蛇. 根据编程语言流行指数排行榜2019年2月的榜单 据了解,目 ...

  9. python实现简单的负载均衡

    提到分发请求,相信大多数人首先会想到Nginx,Nginx作为一种多功能服务器,不仅提供了反向代理隐藏主机ip的能力,还拥有简单的缓存加速功能.当然Nginx最强大的功能还是分发请求,不仅提供了哈希, ...

随机推荐

  1. Loadrunner监控Linux系统资源

    一.安装rsh和rpcbind 1.查看是否安装:rpm -qa |grep rsh 2.安装rsh:yum -y install rsh* 3.yum  -y install nfs-utils r ...

  2. js通过location.search来获取页面传来的参数

    这篇文章主要介绍了通过window.location.search来获取页面传来的参数,经测试是OK的 ? 1 2 3 4 5 function GetQueryString(name) { var ...

  3. FTP协议及工作原理

    1. FTP协议 什么是FTP呢?FTP 是 TCP/IP 协议组中的协议之一,是英文File Transfer Protocol的缩写. 该协议是Internet文件传送的基础,它由一系列规格说明文 ...

  4. hdu分类 Dynamic Programming(这是一场漫长的旅途)

    下面是difficulty 1的题 1003   Max Sum 最长递增子序列.非常经典,最棒的解法是在线算法O(n)的复杂度. 贴的呢,是用dp做的代码. 先是一个高亮的dp递推式,然后找到最大处 ...

  5. dedecms 按权重排序不准或BUG的处理方法

    dede:list 的方法 1.找到"根目录\include\arc.listview.class.php"文件. 2.修改代码:在文件第727行处添加按weight排序判断代码( ...

  6. C语言 右左法则

    C指针声明解读之左右法则 C语言所有复杂的指针声明,都是由各种声明嵌套构成的.如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法.不过,右左法则其实并不是C标准里面的内容,它是从C标准的声明规定 ...

  7. zeppelin-0.6.0安装配置

    从http://zeppelin.apache.org/download.html 下载 zeppelin-0.6.0-bin-all.tgz 解压 修改zeppelin-site.xml,配置端口 ...

  8. Using MySQL Connector .NET 6.6.4 with Entity Framework 5

    I had been waiting for the latest MySQL connector for .NET to come out so I can move on to the new a ...

  9. 自己写的AutoMapper

    using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy ...

  10. ZooKeeper个人笔记Session管理

    Session 1.sessionId  <机器的SID,当前时间>生成一个sessionId,这是全局唯一的. 2.TimeOut 会话的超时时间,注意,这个值和客户端ZooKeeper ...