GraffitiNote

Pythonistaの情報系大学生がプログラミングやらDTMやらデザインやら

pythonで家計簿を付ける その1

家計簿を付ける習慣がない、でもpythonを書く習慣はある。
だからpythonで家計簿を付けよう。

とりあえず記録するところまで書き終えた。

hab.py

import json
import datetime
import locale

#データ格納先ファイル
datafile = "sample.json"

#日付情報
thisdate = datetime.date.today()
thisyear,thismonth,thisday = str(thisdate).split('-')

# データ読み込み
def fileinput(filename,encoding):
    with open(filename,'r',encoding=encoding) as file:
        return(json.load(file))

#データ上書き
def fileoutput(filename,encoding,data):
    with open(filename,'w',encoding=encoding) as file:
        json.dump(data,file)

#データ書き込み
def filewrite(filename,encoding,data):
    with open(filename,'a',encoding=encoding) as file:
        json.dump(data,file)

#年月日補完
def DatetimeCompletion(data):
    revdata = data[::-1]
    if len(revdata) == 3:
        revdata.append(thisday)
    if len(revdata) == 4:
        revdata.append(thismonth)
    if len(revdata) == 5:
        revdata.append(thisyear)
    completedata = revdata[::-1]
    return(completedata)

print("Enter: year month day kind place amount")
while True:
    inputdata = input()
    if inputdata == "exit": #終了
        break
    elif inputdata == "clear": #データ全削除
        fileoutput(datafile,'utf-8',{})
    elif inputdata == "view": #情報一覧表示
        data = fileinput(datafile,'utf-8')
        print(data)
    else:
        newdata = inputdata.split() #標準入力
        completedata = DatetimeCompletion(newdata) #年月日補完
        year,month,day,kind,place,amount = completedata #データ振り分け
        dicdata = {'year':year,'month':day,'day':day,'kind':kind,'place':place,'amount':amount} #辞書にする
        appenddata = {'year':thisyear,'month':thismonth,'day':thisday,'data':dicdata} #記録年月日を付ける
        data = fileinput(datafile,'utf-8') #元データ(辞書)を読み込む
        data[str(len(data)+1)] = appenddata #元データ(辞書)に新しいデータを追加
        fileoutput(datafile,'utf-8',data) #json形式で保存

以下のように、"年 月 日 店名 種別 金額" と入力すると
{ナンバリング{記録年月日{入力データ}}}の辞書の形で追加されていく方式。
年月日はそれぞれ省略すると記録した日の情報が適用される。
"view"を入力で一覧を出力、"clear"でデータ全削除、"exit"で終了。

$ python3 hab.py
Enter: year month day kind place amount
5 food すき家 610
view
{'1': {'day': '07', 'year': '2016', 'month': '06', 'data': {'year': '2016', 'kind': 'food', 'amount': '610', 'place': 'すき家', 'day': '5', 'month': '5'}}}
6 food ローソン 916
2 14 food ローソン 1790
view
{'1': {'day': '07', 'year': '2016', 'month': '06', 'data': {'year': '2016', 'kind': 'food', 'amount': '610', 'place': 'すき家', 'day': '5', 'month': '5'}}, '2': {'day': '07', 'month': '06', 'year': '2016', 'data': {'year': '2016', 'kind': 'food', 'amount': '916', 'place': 'ローソン', 'day': '6', 'month': '6'}}, '3': {'day': '07', 'year': '2016', 'month': '06', 'data': {'year': '2016', 'kind': 'food', 'amount': '1790', 'place': 'ローソン', 'day': '14', 'month': '14'}}}
exit
$ 

表示や演算の部分の実装はまだこれから。
pandas使って綺麗に表示できると良さげかな。