import os
from time import strftime
import pickle
def save(fname):
try :
jin_e = int(input('存入金额:'))
beizhu = input('come money :')
except ValueError : #匹配一种报错时不需要加括号
print('无效的金额')
return #提示报错后,重新返回到show_menu函数
except (KeyboardInterrupt,EOFError): #匹配两种报错时需要加括号
print('\nBye-Bye')
exit()
date = strftime('%Y-%m-%d')
with open(fname,'rb') as fobj:
records = pickle.load(fobj)
#计算最新余额
yu_e = jin_e + records[-1][-2] #求出records里最后一个列表的倒入第二项
record = [date,jin_e,0,yu_e,beizhu]
records.append(record) #将最新的收支记录追加到records里
#将最新的列表写入文件
with open(fname,'wb') as fobj:
pickle.dump(records,fobj)
def cost(fname): #用于记录开销
try:
jin_e = int(input('金额:'))
beizhu = input('备注:')
except ValueError:
print('无效的金额')
return
except (KeyboardInterrupt,EOFError):
print('\nBye-Bye')
exit()
date = strftime('%Y-%m-%d')
#从文件中将列表中取出
with open(fname,'rb') as fobj:
records = pickle.load(fobj)
#记录最新余额
yu_e = records[-1][-2] - jin_e
record = [date,0,jin_e,yu_e,beizhu] #将最新的收支追加到大列表中
records.append(record)
#将列表再次写入文件
with open(fname,'wb') as fobj:
pickle.dump(records,fobj)
def query(fname):
with open(fname,'rb') as fobj: #打开文件,将内容读出来
records = pickle.load(fobj)
#打印表头
print('%-12s%-10s%-12s%-12s%-20s' % ('日期','收入','支出','余额','备注'))
#将每行记录输出
for record in records: #循环大列表中的小列表
print('%-14s%-14s%-12s%-12s%-22s' % tuple(record)) #将列表转成元组 % ( ),利用% s 调用。
def show_menu():
promat = """(0)收入
(1)支出
(2)查询
(3)退出
请选择(0/1/2/3:)"""
#事先定义一个文件,并将指定内容写入文件中,因为内容为列表格式,所以要用pickele函数
fname = 'account.data' #定义一个记账的文件
if not os.path.exists(fname): #判断文件是否存在,存在则不执行二级代码
init_data = [[strftime('%Y-%m-%d'),0,0,100000,'init data']] #将datetime转成指定字符串
fobj = open(fname,'wb')
pickle.dump(init_data,fobj)#利用pickle.dump将列表init_data写进fobj里
fobj.close()
funs = { '0':save,'1':cost,'2':query }
while 1:
try:
xz = input(promat).strip() #去除用户输入字符两端的空格
except (KeyboardInterrupt,EOFError): #如果用户按了ctrl + c 或者 ctrl + d就表示退出
print('Bye-Bye')
break
if xz not in ['0','1','2','3']:
print("格式错误,请重试")
continue
if xz == '3':
print('Bye-Bye')
break
funs[xz](fname)
if __name__ == '__main__':
show_menu()
[root@python day6]# python3 lianxi.py
(0)收入
(1)支出
(2)查询
(3)退出
请选择(0/1/2/3:)0
存入金额:1000
收入来源:红包
(0)收入
(1)支出
(2)查询
(3)退出
请选择(0/1/2/3:)1
金额:300
备注:买衣服
(0)收入
(1)支出
(2)查询
(3)退出
请选择(0/1/2/3:)2
日期 收入 支出 余额 备注
2020-06-18 0 0 100000 init data
2020-06-18 1000 0 101000 红包
2020-06-18 0 300 100700 买衣服
(0)收入
(1)支出
(2)查询
(3)退出
请选择(0/1/2/3:)3
Bye-Bye
这个案例很重要,勤练习!