本文章并没有Qt知识,想要学习Qt的同学可以点击下方链接或自行搜索。谢谢理解
前言
和朋友一起开元了一个账本项目。
他做前端,我做后端,想学习前端的同学点击这里:链接
@GoodCoder666负责制作的前端
目标功能
- 打开已经保存的账本文件
- 保存文件
- 在给定数据中查找文件
- 按照事件、时间统计收支
- 统计总收支
还是比较简单的
实现
打开文件
需要一个参数:文件名
打开相应文件名,依次读入:时间,事件,金额, 备注
并append到列表中,最后return之
def openFile(filename):
'''
Open file.
File format: 4 lines per record for date, event type, money delta, and note.
Such as:
(file.example, encoding=utf-8)
(Record 1)
(ln 1) date1
(ln 2) event_type1
(ln 3) money_delta1
(ln 4) note1
(Record 2)
(ln 5) date2
(ln 6) event_type2
(ln 7) money_delta2
(ln 8) note2
@param filename: File name.
Returns: data in the format [[date1, event_type1, money_delta1, note1], ...]
'''
with open(filename, 'r', encoding='utf-8') as f:
res = []
while date := f.readline():
if (etype := f.readline()) and (mdelta := f.readline()) and (note := f.readline()):
res.append([date.rstrip('\n'), etype.rstrip('\n'), mdelta.rstrip('\n'), note.rstrip('\n')])
else:
raise ApiError('Unexpected EOF at ' + filename)
return res
保存文件
和打开类似
两个参数:文件名、数据(二维数组)
遍历数据,每次将一维数组print到文件中即可
def saveFile(filename, data): # Save
'''
Save with the same format mentioned in openFile().
@param filename: File name.
@param data: Data with the same format returned in openFile().
'''
with open(filename, 'w', encoding='utf-8') as f:
for line in data:
print(*line, sep='\n', file=f)
查询文件
两个参数:数据、关键字
遍历数据,并将包含关键字数据 的复制到另一个列表中,返回该列表
def query(data, key):
return [record for record in data if any(key in x for x in record)] if key else data
综合统计
一个参数:数据
遍历所有数据,统计收支,并return即可
def total(data):
in_total = out_total = 0
for _, _, mdelta, _ in data:
mdelta = int(mdelta)
if mdelta < 0:
out_total -= mdelta
else:
in_total += mdelta
return in_total, out_total
事件/时间统计
一个参数:数据
统计数据中每一个不同事件/时间的收支,并返回list即可
def totalByEvent(data):
cnt = defaultdict(lambda: [0, 0])
for _, event, mdelta, _ in data:
mdelta = int(mdelta)
if mdelta < 0:
cnt[event][1] -= mdelta
else:
cnt[event][0] += mdelta
return cnt
def totalByDate(data):
cnt = defaultdict(lambda: [0, 0])
for date, _, mdelta, _ in data:
mdelta = int(mdelta)
if mdelta < 0:
cnt[date][1] -= mdelta
else:
cnt[date][0] += mdelta
return cnt
总代码
from collections import defaultdict
class ApiError(RuntimeError):
pass
def openFile(filename):
'''
Open file.
File format: 4 lines per record for date, event type, money delta, and note.
Such as:
(file.example, encoding=utf-8)
(Record 1)
(ln 1) date1
(ln 2) event_type1
(ln 3) money_delta1
(ln 4) note1
(Record 2)
(ln 5) date2
(ln 6) event_type2
(ln 7) money_delta2
(ln 8) note2
@param filename: File name.
Returns: data in the format [[date1, event_type1, money_delta1, note1], ...]
'''
with open(filename, 'r', encoding='utf-8') as f:
res = []
while date := f.readline():
if (etype := f.readline()) and (mdelta := f.readline()) and (note := f.readline()):
res.append([date.rstrip('\n'), etype.rstrip('\n'), mdelta.rstrip('\n'), note.rstrip('\n')])
else:
raise ApiError('Unexpected EOF at ' + filename)
return res
def saveFile(filename, data): # Save
'''
Save with the same format mentioned in openFile().
@param filename: File name.
@param data: Data with the same format returned in openFile().
'''
with open(filename, 'w', encoding='utf-8') as f:
for line in data:
print(*line, sep='\n', file=f)
def query(data, key):
return [record for record in data if any(key in x for x in record)] if key else data
def total(data):
in_total = out_total = 0
for _, _, mdelta, _ in data:
mdelta = int(mdelta)
if mdelta < 0:
out_total -= mdelta
else:
in_total += mdelta
return in_total, out_total
def totalByEvent(data):
cnt = defaultdict(lambda: [0, 0])
for _, event, mdelta, _ in data:
mdelta = int(mdelta)
if mdelta < 0:
cnt[event][1] -= mdelta
else:
cnt[event][0] += mdelta
return cnt
def totalByDate(data):
cnt = defaultdict(lambda: [0, 0])
for date, _, mdelta, _ in data:
mdelta = int(mdelta)
if mdelta < 0:
cnt[date][1] -= mdelta
else:
cnt[date][0] += mdelta
return cnt
尾声
下一个项目正在开发中
搞好了会写文章的