You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 12:45:42