乍一看很像json格式的文件,实际上不是进入正题: ?️? 1. 读取数据
with open('data.txt') as f: data = f.read()
?️? 2. 正则提取花括号{}里面的信息datas = re.findall('({.*?})',data)
内容基本上就是编程语言各日期的占比情况,接下来就是提取日期信息和数据信息了。
?️? 3. 提取name,注意转义(')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实战系列 | 正则提取数据并绘图的详细内容。