显示Python程序运行进度
前两天做query分析时候,需要从20w随机query中筛选出包括股票实体的query,股票实体大概5000多个。于是写了个循环处理,代码如下:
# 读取query
with open('query_20w.txt', 'r', encoding='utf-8') as fq:
query = fq.readlines()
# 读取股票实体
with open('entity.txt', 'r', encoding='utf-8') as fe:
entity = fe.readlines()
# 用两层循环做query筛选
for q in query:
q = q.strip()
for e in entity:
e = e.strip()
# 判断query中是否包含实体,若包含则输出query及相应的实体
if q.find(e) >= 0:
with open('result.txt', 'a') as fr:
match_str = q + '\t' + e + '\n'
fr.write(match_str)
break
因为输出比较多,所以我没有直接在终端上输出,而是写入文件result.txt
。
程序功能其实已经OK了,但比较郁闷的是程序运行比较久,期间又没有任何提示,不清楚程序的运行状态,运行结束了也不知道。
可以直接在程序结尾加print('done')
来判断是否运行结束,但还是无法提示程序的运行状态,所以想能不能做个进度条之类的,实时提示程序运行状态。
思路挺简单,就是在循环模块中不停的输出状态信息,但需要每次输出时把前一次输出的内容覆盖掉,从而在终端上始终只显示一行提示。转义字符\r
可以实现该功能,它的作用就是告诉终端把光标移到行首。
于是修改代码如下:
# 读取query
with open('query_20w.txt', 'r', encoding='utf-8') as fq:
query = fq.readlines()
# 读取股票实体
with open('entity.txt', 'r', encoding='utf-8') as fe:
entity = fe.readlines()
# 用两层循环做query筛选
cnt_q = cnt_m = 0 # 计数器,分别记录query数和匹配的结果数
for q in query:
cnt_e = 0 #计数器,记录实体数
cnt_q += 1 # query计数器加1
q = q.strip()
for e in entity:
cnt_e += 1 #实体计数器加1
e = e.strip()
# 判断query中是否包含实体,若包含则输出query及相应的实体
if q.find(e) >= 0:
cnt_m += 1 #匹配结果加1
with open('result.txt', 'a') as fr:
match_str = q + '\t' + e + '\n'
fr.write(match_str)
# 输出状态,其中\r将光标定位到行首
print('正在分析第{}个query和第{}个实体,已累计输出{}个结果...'.format(cnt_q, cnt_e, cnt_m), end='\r')
break
# 程序运行结束提示
print('\n运行结束')
运行时,终端提示如下:
正在分析第19392个query和第704个实体,已累计输出235个结果...
网上查资料的时候,也有一些库可以实现进度条功能。但觉得这个方案最简单实用。