【问题标题】:Writing live data from an Arduino to a CSV in Python在 Python 中将实时数据从 Arduino 写入 CSV
【发布时间】:2017-10-18 03:04:02
【问题描述】:

我使用的是 Python 3.5,但在尝试将实时数据打印到 CSV 以进行后期处理时遇到了一些麻烦。我正在使用 Arduino 从应变仪和光电传感器收集数据,以便为我的学校车队实时更新 Dyno。到目前为止,我已经设法将最后一行数据打印到 CSV,但这还不够。

我需要它在团队完成测试后打印所有这些数据,以查看他们对引擎所做的修改。我确实在串行监视器中显示了他们的所有相关数据,但如果他们能够拥有用于查看以前测试的数据,那对他们来说会很棒。

import serial
import csv
import time
import numpy as np
import warnings
import serial
import serial.tools.list_ports

arduino_ports = [
    p.device
    for p in serial.tools.list_ports.comports()
    if 'Arduino' in p.description
]
if not arduino_ports:
    raise IOError("No Arduino found")
if len(arduino_ports) > 1:
    warnings.warn('Multiple Arduinos found - using the first')

Arduino = serial.Serial(arduino_ports[0])
Arduino.flush()
Arduino.reset_input_buffer()

start_time=time.time()
Distance = 0.5 # This is how long the lever arm is in feet

while True:
    while (Arduino.inWaiting()==0):
        pass
    try:
        data = Arduino.readline()
        dataarray = data.decode().rstrip().split(',')
        Arduino.reset_input_buffer()
        Force = float(dataarray[0])
        RPM = float (dataarray[1])
        Torque = Force * Distance
        HorsePower = Torque * RPM / 5252
        Run_time = time.time()-start_time
        print (Force , 'Grams',"," , RPM ,'RPMs',"," ,Torque,"ft-lbs",",", HorsePower, "hp", Run_time, "Time Elasped")
    except (KeyboardInterrupt, SystemExit,IndexError,ValueError):
        pass
    with open('DynoData.csv', 'w') as outfile:
        outfileWrite = csv.writer(outfile)
        outfileWrite.writerow([Force, RPM])

    outfile.close()

【问题讨论】:

    标签: python python-3.x csv export-to-csv


    【解决方案1】:

    您已将文件打开和关闭代码包装在 while 循环中:with 块。对于一阶近似,with 语句使用 上下文管理器 来确保“无论如何都会发生某些事情”。在这种情况下,它确保文件在with 块结束后立即关闭。这会为每个循环迭代创建一个 new 文件(命名为 DynaData.csv),因此唯一保留的数据是最后写入的数据,即 CSV 输出的单行。

    请注意,这意味着您尝试关闭文件:

    outfile.close()
    

    如果解释器没有直接抛出异常,充其量是多余的。

    如果您想在数据进入时不断写入文件,请将您的 while 循环包含在 with open... 块中:

    with open('DynoData.csv', 'w') as outfile:
        outfileWrite = csv.writer(outfile)
        while True:
            ...
            # code to collect your data omitted
            ...
            outfileWrite.writerow([Force, RPM])
    

    为了完整起见,请注意,您也可以在每次迭代时选择outfile.flush()。该文件将在每次写入换行符时或当内部缓冲区已满时刷新其未写入的缓冲区,因此,如果您需要或想要这样做,请进行试验。

    【讨论】:

    • 这似乎解决了我的问题,但是当它保存信息时,行之间似乎有一个空格。这不是一个关键问题,但是拥有所有数据的整洁电子表格,我认为最好不要在每行之间留空格。例如,具有 20 个数据点的样本集将使用 40 行。
    • 刚刚注意到我给你的一个错误:将 ` = csv.writer(outfile)` 移动到 while 循环的 outside。显然不是有害的,因为它有效,但也不正确。这是我能看到的额外换行符的唯一来源。现在只有一条语句写入文件。看看这是否能解决您的问题?
    • 遗憾的是,输出文件没有因该更改而发生更改,但我很高兴知道制作这部分代码的正确方法。
    • 关于额外的换行符,你见过CSV in Python adding an extra carriage return吗?
    • 看来通过添加newline= ' ' 已经解决了我的问题。谢谢
    猜你喜欢
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    相关资源
    最近更新 更多