【问题标题】:Is there any way to store data every 5 second in new text file?有没有办法在新的文本文件中每 5 秒存储一次数据?
【发布时间】:2020-06-15 10:31:40
【问题描述】:

我创建了一个读取传感器数据的程序。根据我的用例,我必须每 5 秒将读数存储在一个文本文件中,并使用新的文件名示例:file1、file2、file3 等等,直到我使用键盘停止程序。谁能指导我完成这项任务?

import sys
import time
import board
import digitalio
import busio
import csv
import adafruit_lis3dh
from datetime import datetime, timezone
i2c = busio.I2C(board.SCL, board.SDA)
int1 = digitalio.DigitalInOut(board.D6)  # Set this to the correct pin for the interrupt!
lis3dh = adafruit_lis3dh.LIS3DH_I2C(i2c, int1=int1)
lis3dh.range = adafruit_lis3dh.RANGE_2_G



with open("/media/pi/D427-7B2E/test.txt", 'w') as f:
  sys.stdout = f


  while True:
      ti = int(datetime.now(tz=timezone.utc).timestamp() * 1000)
      x, y, z = lis3dh.acceleration
      print('{}, {}, {}, {}'.format(ti,x / 9.806, y / 9.806, z / 9.806))
      time.sleep(0.001)
      pass

【问题讨论】:

  • 由于while 循环休眠0.001 秒,您当然可以编写一个计数器来跟踪它运行了多少次,因此您的代码每次计数器达到 5000 (记得重置它)。更好的方法是计算您的代码最后记录了多长时间并执行写入文件的语句,然后时间限制超过 5 秒(并重置该计数器)
  • while 循环一直在运行
  • 是的,在 while 循环中,您需要添加逻辑来跟踪计数器或时间。
  • 你能分享一个例子吗?

标签: python datetime time python-datetime


【解决方案1】:

您可以尝试记录吗? 看看 TimedRotatingFileHandler 可能会有所帮助

您能否将 threading.Timer 视为递归并根据需要设置计时器并在程序开始时调用该函数,您可以更新 array/dict 中的文件名,以便将其反映到程序的其余部分,或者您可以将数组的内容写入文件并清空数组。

     def write_it():
        threading.Timer(300, write_it).start()

     write_it()

【讨论】:

  • 感谢您的回复。在我的代码中,问题是我得到了时间变化。代码是将值存储在 txt 文件中,但存储值需要 1-2 秒,因此我没有得到确切的时间范围。所以我想先将值存储在数组中,然后再存储到文件中。你怎么看?
【解决方案2】:

我使用 RotatingFileHandler 解决了它,它是一个 python 日志记录类。我们的范围从 5 秒变为 1 小时,所以我做了什么我运行程序 1 小时,我得到了一个 135 mb 的文件,我将其转换为字节并在 maxBytes 参数中使用这些字节。所以现在在这段代码中发生的事情是,一旦文件大小达到代码中提到的字节,它就会创建另一个文件并开始在其中存储值,并继续对 5 个文件执行相同的操作。我希望这对其他有类似用例的人有所帮助。

logger = logging.getLogger("Rotating Log")
logger.setLevel(logging.INFO)

  handler = RotatingFileHandler('/home/pi/VibrationSensor/test.txt', maxBytes=20, backupCount=5)
  logger.addHandler(handler)

  while True:
    ti = int(datetime.now(tz=timezone.utc).timestamp() * 1000)
    x, y, z = lis3dh.acceleration
    logger.info('{}, {}, {}, {}'.format(ti,x / 9.806, y / 9.806, z / 9.806))
    time.sleep(0.001)
    pass

【讨论】:

    猜你喜欢
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多