使用Matplotlib绘制Python循环处理实时CSV文件的结果
实时绘制CSV新增数据的解决方案
看起来你正在尝试实时绘制每秒新增一行的CSV数据,我帮你完善代码并优化了数据处理逻辑,让整个流程更可靠、更易维护:
完整实现代码
import csv import matplotlib.pyplot as plt import time # 开启matplotlib交互模式,支持实时更新图表 plt.ion() # 初始化存储时间序列和数值的列表 time_stamps = [] measurements = [] # 打开目标CSV文件 with open(r'c:\temp\samples.csv', 'r') as entrada: # 使用csv读取器自动处理引号、分隔符,比手动字符串切片更鲁棒 csv_reader = csv.reader(entrada) # 记录当前文件读取位置,用于后续只读取新增内容 last_read_position = entrada.tell() # 持续监听文件新增内容 while True: # 回到上次读取的位置,避免重复处理旧数据 entrada.seek(last_read_position) # 读取所有新增行 for row in csv_reader: if row: # 跳过可能存在的空行 # 解析时间戳和数值(自动处理引号) timestamp = row[0] value = float(row[1]) time_stamps.append(timestamp) measurements.append(value) # 更新读取位置,下次只处理新内容 last_read_position = entrada.tell() # 绘制/更新图表 plt.clf() # 清除旧图表内容 plt.plot(time_stamps, measurements, marker='.', linestyle='-', color='#1f77b4') plt.xlabel('Timestamp') plt.ylabel('Measurement Value') plt.title('Real-Time CSV Data Plot') # 旋转x轴标签避免重叠 plt.xticks(rotation=45, ha='right') plt.tight_layout() # 自动调整布局适配标签 # 刷新图表显示 plt.draw() plt.pause(0.1) # 匹配文件每秒新增一行的频率,减少不必要的循环 time.sleep(1)
关键优化说明
- 用
csv.reader替代手动字符串处理:你原代码里的切片方式依赖固定字符串长度,一旦时间格式有微小变化(比如毫秒位数改变)就会出错,csv.reader会自动处理引号和分隔符,更可靠。 - 实时读取新增内容:通过
file.seek()记录上次读取位置,避免每次循环都从头读取整个文件,效率更高。 - 交互模式绘图:
plt.ion()开启交互模式,让图表可以实时更新而不阻塞程序运行。 - 可选:限制显示数据量:如果数据积累太多导致图表拥挤,可以在添加数据后加入以下代码,只保留最近50个数据点:
if len(time_stamps) > 50: time_stamps.pop(0) measurements.pop(0)
内容的提问来源于stack exchange,提问作者John_Doe
相关产品推荐
相关产品推荐

