Python提取文本指定行数值转数字列表 修复violinplot报错
问题根因
你的代码有两个直接导致报错的问题:
re.findall()的返回值是列表类型,你直接把这个列表插入new_list,最终得到的是嵌套字符串列表,结构为[['33.00'], ['32.61'], ...],不是violinplot要求的一维数值序列- 提取到的speed值是字符串格式,没有转换为浮点型数值,matplotlib无法对字符串做最小值、分位数这类统计计算
另外你贴的代码里with open('fcd.xml') as f:下面的代码没有缩进,运行时会先触发语法错误,需要注意Python的缩进规则。
修复后代码
import matplotlib.pyplot as plt import re target_id = 'tester.3' speed_list = [] pattern = r'speed="([\d.]+)"' with open('fcd.xml') as f: for line in f: # 不需要一次性readlines存所有行,直接逐行遍历更省内存 if target_id in line: match_res = re.findall(pattern, line) if match_res: # 避免行格式异常匹配不到值时触发索引错误 speed_list.append(float(match_res[0])) print(speed_list) # 输出为一维浮点数列表,格式如[24.87, 25.97, ...] fig = plt.figure() ax = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # 调整边距避免坐标轴贴边显示不全 ax.violinplot(speed_list) plt.show()
优化点说明
- 去掉了没必要的
idx计数器和insert操作,用append直接追加元素就可以实现顺序存储,写法更简洁 - 直接在文件句柄上逐行遍历,不需要一次性把所有行读入内存,处理大文件时性能更好
- 增加了匹配结果非空判断,遇到格式异常的行不会中断程序
- 调整了子图边距参数,避免生成的图表坐标轴被画布边缘截断
内容的提问来源于stack exchange,提问作者kostas
相关产品推荐
相关产品推荐

