前两天做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个结果...

网上查资料的时候,也有一些库可以实现进度条功能。但觉得这个方案最简单实用。

🔔 Email 或 RSS 订阅本博客

添加新评论