目标:
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()