jq 实现20条记录按每五条记录打印出来_动手打造属于自己的流水账记录器,实践是检验真理的唯一标准 | Python基础连载(二十)...

开篇

本期将动手制作属于自己的简易流水账管理工具,先看一下最终成品:

jq 实现20条记录按每五条记录打印出来_动手打造属于自己的流水账记录器,实践是检验真理的唯一标准 | Python基础连载(二十)..._第1张图片

只需双击写好的run.py文件,即可进入下面的界面,是不是有一点点酷呢~

jq 实现20条记录按每五条记录打印出来_动手打造属于自己的流水账记录器,实践是检验真理的唯一标准 | Python基础连载(二十)..._第2张图片

好了,现在开始吧~

前置知识

  • 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

定义一个流水账类RunningAccount

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()

这样,只需双击本文件,就可以在弹出的窗口中进行操作啦

jq 实现20条记录按每五条记录打印出来_动手打造属于自己的流水账记录器,实践是检验真理的唯一标准 | Python基础连载(二十)..._第3张图片

等等,是不是少了些什么?

哦,是每次进入程序时大大的欢迎.这个很简单,直接找一个字符文字生成器生成,然后拷贝到上面的while死循环最开始位置就好了,就像这样:

jq 实现20条记录按每五条记录打印出来_动手打造属于自己的流水账记录器,实践是检验真理的唯一标准 | Python基础连载(二十)..._第4张图片

至此,全部代码已经编写完成。

最后列出完整的代码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()

本系列教程已经接近尾声了,希望能够有帮助到大家,加油!

你可能感兴趣的:(jq)