卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章64334本站已运行4115

Python实战系列 | 正则提取数据并绘图


本期给大家分享《Python实战系列》的第一篇文章:正则提取数据并绘图,该系列主要来自粉丝的实际问题,后期会不断更新,希望对你有所帮助,如有疑问或者需要改进的地方可以私信小编。
任务描述: 取txt文件各语言数据绘制折线图,data.txt文件截图如下(太长了直截了一部分):

Python实战系列 | 正则提取数据并绘图

乍一看很像json格式的文件,实际上不是Python实战系列 | 正则提取数据并绘图
进入正题:

?️‍? 1. 读取数据

with open('data.txt') as f:
    data = f.read()
?️‍? 2. 正则提取花括号{}里面的信息
datas = re.findall('({.*?})',data)
Python实战系列 | 正则提取数据并绘图

Python实战系列 | 正则提取数据并绘图

内容基本上就是编程语言各日期的占比情况,接下来就是提取日期信息和数据信息了。


?️‍? 3. 提取name,注意转义(')
Python实战系列 | 正则提取数据并绘图
re.findall(''(.*)'',datas[0])[0]
?️‍? 4. 提取日期和数据,注意数据小数点
re.findall('(d+(.d+)?)',datas[0])
每4个数据为一组,所以做个step=4的循环即可:
for i in range(0,len(datas_tmp),4):
    datas_f.append(float(datas_tmp[i+3][0]))
    dates_f.append(f'{datas_tmp[i][0]}-{datas_tmp[i+1][0]}-{datas_tmp[i+2][0]}')

?️‍? 5. 数据提取部分完整代码

# 处理数据
with open('data.txt') as f:
    data = f.read()
datas = re.findall('({.*?})',data)
names = []
dates_result = []
datas_result = []
for idx,dd in enumerate(datas):
    datas_f = []
    dates_f = []
    name = re.findall(''(.*)'',dd)[0]
    names.append(name)
    datas_tmp = re.findall('(d+(.d+)?)',dd)
    for i in range(0,len(datas_tmp),4):
        datas_f.append(float(datas_tmp[i+3][0]))
        dates_f.append(f'{datas_tmp[i][0]}-{datas_tmp[i+1][0]}-{datas_tmp[i+2][0]}')
    datas_result.append(datas_f)
    dates_result.append(dates_f)


?️‍? 6. 绘图

绘图部分直接用matplotlib的plot循环绘制即可,代码如下:

# 绘图
plt.figure(figsize=(20, 10), dpi=100)
for i in range(len(names)):
    plt.plot(dates_result[i], datas_result[i], label=names[i])
ax = plt.gca()
ax.xaxis.set_major_locator(ticker.MultipleLocator(20))
plt.ylabel("Ratings(%)", fontdict={'size': 16})
plt.title("TIOBE Programming Community Index", fontdict={'size': 20})
plt.legend(loc='best')
plt.grid(True, linestyle='--', alpha=0.5)
plt.show()

Python实战系列 | 正则提取数据并绘图


卓越飞翔博客
上一篇: Python实现无头浏览器采集应用的代理设置与IP切换功能详解
下一篇: 使用Go语言构建的微服务定时任务调度器
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏