【问题标题】:Reading from a sensor and writing to a CSV file从传感器读取并写入 CSV 文件
【发布时间】:2021-06-02 14:40:40
【问题描述】:

我有一个传感器可以打印到我的COM4 端口。我可以使用serial 阅读此内容,例如:

import serial
ser = serial.Serial('COM4')
while True:
    if ser.in_waiting > 0:
        temp = ser.readline()
        print(temp)

有没有一种有效的方法可以将其写入 CSV 文件而不是打印到控制台?

我遇到的问题是,如果我在中途停止脚本,那么对文件的更改似乎会被丢弃,即使我在 while True 循环之前包含了一个写入标头的步骤。

【问题讨论】:

  • 这能回答你的问题吗? How do I read and write CSV files with Python?
  • 我应该更具体一些,对于我的情况,当我正在读取实时传感时,如果我停止读取脚本,则文件不会更新并且所有更改都会丢失。
  • 啊,我明白了。您想在写入文件后flush()。 stackoverflow.com/questions/3976711/…
  • 这会导致显着减速吗?例如,与在每个readline() 打开文件并添加最新测量值相比?
  • 文件 IO 很昂贵,所以我希望它会。你可以试试看是不是太合你的胃口了。或者,您可以收听SIGINT/SIGTERM 并在发生这种情况时在退出之前关闭文件。 stackoverflow.com/questions/18499497/…

标签: python csv


【解决方案1】:
import csv
import serial
ser = serial.Serial('COM4')
while true:
  with open("csv-file-name.csv", 'w') as csvfile:
      writer = csv.writer(csvfile, delimiter=",")
      if ser.in_waiting > 0:
        temp = ser.readline()
        writer.writerow(temp)

查看this page 了解更多信息。

【讨论】:

  • 您是否将“import serial”替换为“import csv”?
  • 不,你应该两者都有。编辑代码
  • 这是我最初的,但如果我突然停止这段代码,就好像文件没有被触及一样。我把它归结为文件关闭不当。
  • 这是因为 with 子句会在文件运行完毕后关闭文件,您应该尝试切换顺序并将 with 子句放在 while 循环中。修改了代码。
  • 那么这大致相当于在 while 循环中编写 writer.flush() 吗?除了打开文件可能比刷新到文件更费力?
【解决方案2】:

我最终按照 Pranav Hosangadi 的建议,手动处理 sigterm 调用

import serial
import signal

def signal_handler(signal, frame):
    global interrupted
    interrupted = True


signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
interrupted = False

if __name__ == '__main__':
    ser = serial.Serial('COM4')
    with open(filename, 'w') as f:
        while True:
            if ser.in_waiting > 0:
                temp = ser.readline()
                f.write(temp)

            if interrupted:
                break

【讨论】:

    【解决方案3】:

    readline 处于阻塞状态,因此 in_waiting 不是必需的。

    而不是print,只需在文件中使用write:

    import serial
    
    port = serial.Serial('COM4')
    with open("output.csv", "w") as output:
        for line in port:
            output.write(line)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      相关资源
      最近更新 更多