本期将动手制作属于自己的简易流水账管理工具,先看一下最终成品:
只需双击写好的run.py
文件,即可进入下面的界面,是不是有一点点酷呢~
好了,现在开始吧~
eval
栗子1
>>> x='1+1'
>>> type(x)
>>> eval(x)
2
栗子2
>>> d="{'name': 'zz'}"
>>> type(d)
>>> dd=eval(d)
>>> type(dd)
不难看出,eval()
可以将字符串转为Python
的数据类型,只要该字符串满足Python
数据类型的基本格式。
文件操作
使用open()
函数打开文件;
使用read()
或者readlines()
来一次性读取全部文件(read
)或者逐行读取文件得到一个列表,列表中的每个元素都是文件的一行内容(readlines
);
使用write()
向文件中写入内容。
具体用法请在接下来的内容中体会。
我们主要实现添加和显示清单的功能,以及如何将数据存储到本地。
主要需要完成的工作如下:
(1)分析所需文件
(2)获取当前时间
(3)定义一个流水账类
(4)实现"添加并保存至本地"的功能
(5)实现"展示全部记录"的功能
(6)实现"用户调用的接口"
本程序中,将总收入、总支出以及总记录数存入info.txt
进行保存,将全部的记录存入all_item.txt
进行保存。
为了避免错误,请在与你的.py
文件同级目录下手动创建以上两个文件(初始内容为空)。
每一条新的记录都需要显示被创建的时间,因此需要想办法获取当前时间。
import datetime
def get_current_time():
time_stamp = datetime.datetime.now()
return time_stamp.strftime('%Y.%m.%d-%H:%M:%S')
借助datetime
模块,我们可以得到当前时间,运行上述函数,就可以得到当前时间了,比如我写这篇文章的时间是2020.09.08-20:11:45
。
class RunningAccount():
def __init__(self):
xx=open('info.txt','r')
content=xx.read()
if content=='':
print('数据仓库为空!')
self.all_income,self.all_outcome,self.cnt=0,0,0
else:
self.all_income,self.all_outcome,self.cnt=eval(content)
xx.close()
上面定义了RunningAccount
类,并初始化了__init__
方法:
首先,打开info.txt
,并读取其中内容,存入content
;
然后分为两种情况:
(1)如果info.txt
为空,则说明这是第一次运行程序,于是会初始化总收入、总支出以及总记录数都为0;
(2)否则(info.txt
不为空),读取当前的总收入、总支出以及总记录数。
最后别忘记关闭文件。
#num是金额,plus是备注(比如该金额的用途等)
def add_and_save(self,num,plus):
#使用追加模式
with open('all_item.txt','a+') as file:
dic={}
dic[get_current_time()]=[num,plus]
file.write(str(dic)+'\n')
print("添加成功!")
#更新数据条目
self.cnt=self.cnt+1
#更新总收入和总支出
if num<0:
self.all_outcome+=num
else:
self.all_income+=num
with open('info.txt','w') as f:
f.write(str([self.all_income,self.all_outcome,self.cnt]))
print('全局信息更新成功!')
首先打开all_item.txt
文件,使用追加模式(a+)来在文件末尾添加一条新的记录,以免产生覆盖;
然后定义了一个字典dic
,用于暂时保存一条新的记录,键代表时间,值代表金额和备注;
接着将dic
写入all_item.txt
,总的记录数加1,并更新总收入和总支出;
最后以写的方式(w
)打开info.txt
,更新总记录数、总收入与总支出这三个数字。
def show(self):
f=open('info.txt','r')
all_income,all_outcome,cnt=eval(f.read())
f.close()
print('#####################################################################')
print('总收入:',self.all_income)
print('总支出:',self.all_outcome)
print('净余额:',self.all_income+self.all_outcome)
print('######################################################################')
print(' 共检索到%d条记录'%cnt)
print('######################################################################\n')
with open(r'all_item.txt','r') as f:
print('日期\t\t\t\t收入/支出金额\t\t\t用途\n')
for line in f.readlines():
line=eval(line)
date,info=list(line.keys())[0],list(line.values())[0]
number,use=info
print('{}\t\t\t{}\t\t\t{}'.format(date,number,use))
print('#######################################################################\n')
首先打开info.txt
文件,读取总收入、总支出以及总记录数并打印出来;
然后打开all_item.txt
,逐行读取其中内容,并按照日期,金额,用途
的格式打印。
以上已经实现了一个流水账记录器所需全部组件,现在将它们组合在一起,就可以完成我们的流水账记录器啦:
while True:
x=RunningAccount()
ch=input('操作提示:输入数字1进行添加,输入数字2列出清单,输入字母q退出程序\n')
if ch=='q':
break;
number=int(ch)
if number==1:
num,use=input('请输入金额以及用途,以空格分隔,比如"-100 购物"\n').split()
try:
num=float(num)
x.add_and_save(num,use)
except:
print('数字输入有误,操作取消...')
elif number==2:
x.show()
这样,只需双击本文件,就可以在弹出的窗口中进行操作啦
等等,是不是少了些什么?
哦,是每次进入程序时大大的欢迎
.这个很简单,直接找一个字符文字生成器生成,然后拷贝到上面的while
死循环最开始位置就好了,就像这样:
至此,全部代码已经编写完成。
最后列出完整的代码run.py
:
######################################################获取当前时间######################################################
import datetime
def get_current_time():
time_stamp = datetime.datetime.now()
return time_stamp.strftime('%Y.%m.%d-%H:%M:%S')
######################################################功能实现部分######################################################
class RunningAccount():
def __init__(self):
xx=open('info.txt','r')
content=xx.read()
if content=='':
print('数据仓库为空!')
self.all_income,self.all_outcome,self.cnt=0,0,0
else:
self.all_income,self.all_outcome,self.cnt=eval(content)
xx.close()
#print(self.all_income,self.all_outcome,self.cnt)
#num是金额,plus是备注(比如该金额的用途等)
def add_and_save(self,num,plus):
#使用追加模式
with open('all_item.txt','a+') as file:
dic={}
dic[get_current_time()]=[num,plus]
file.write(str(dic)+'\n')
print("添加成功!")
#更新数据条目
self.cnt=self.cnt+1
#更新总收入和总支出
if num<0:
self.all_outcome+=num
else:
self.all_income+=num
with open('info.txt','w') as f:
f.write(str([self.all_income,self.all_outcome,self.cnt]))
print('全局信息更新成功!')
def show(self):
f=open('info.txt','r')
all_income,all_outcome,cnt=eval(f.read())
f.close()
print('#####################################################################')
print('总收入:',self.all_income)
print('总支出:',self.all_outcome)
print('净余额:',self.all_income+self.all_outcome)
print('######################################################################')
print(' 共检索到%d条记录'%cnt)
print('######################################################################\n')
with open(r'all_item.txt','r') as f:
print('日期\t\t\t\t收入/支出金额\t\t\t用途\n')
for line in f.readlines():
line=eval(line)
date,info=list(line.keys())[0],list(line.values())[0]
number,use=info
#print(date,' ',number,' ',use)
print('{}\t\t\t{}\t\t\t{}'.format(date,number,use))
print('#######################################################################\n')
##################用户调用接口##################
hello=""" ■ ■ ■■ ■ ■ ■■■■■■■■■
■■■■ ■ ■ ■ ■ ■■ ■ ■■■■■■■■ ■ ■ ■
■ ■■■■■■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■■ ■■■■■■ ■■■■■■■■■
■ ■ ■ ■■ ■ ■ ■ ■■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■■ ■ ■ ■ ■
■■ ■ ■ ■■ ■ ■ ■ ■■ ■■■■■■■■■
■ ■ ■■■ ■ ■■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■■ ■ ■ ■
■ ■ ■■ ■■ ■ ■■■ ■■ ■ ■
■ ■ ■ ■■■■■■■ ■ ■■ ■■■ ■ ■ ■■
"""
print(hello)
while True:
x=RunningAccount()
ch=input('操作提示:输入数字1进行添加,输入数字2列出清单,输入字母q退出程序\n')
if ch=='q':
break;
number=int(ch)
if number==1:
num,use=input('请输入金额以及用途,以空格分隔,比如"-100 购物"\n').split()
try:
num=float(num)
x.add_and_save(num,use)
except:
print('数字输入有误,操作取消...')
elif number==2:
x.show()
本系列教程已经接近尾声了,希望能够有帮助到大家,加油!