記賬小程序
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
備註:
這個案例很重要,勤練習!