Python記賬小程序_周結

記賬小程序

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

備註:

這個案例很重要,勤練習!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章