有没有办法每 5 秒在新文本文件中存储一次数据?
Is there any way to store data every 5 second in new text file?
我创建了一个读取传感器数据的程序。根据我的用例,我必须每 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
你可以尝试登录吗?
看看 TimedRotatingFileHandler 可能会有帮助
您能否将 threading.Timer 视为递归的并根据需要设置计时器并在程序启动时调用该函数,您可以更新 array/dict 中的文件名以便将其反映到程序的其余部分,或者您可以将数组的内容写入文件并清空数组。
def write_it():
threading.Timer(300, write_it).start()
write_it()
我使用 RotatingFileHandler 解决了它,它是一个 python 日志 class。我们的范围从 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
我创建了一个读取传感器数据的程序。根据我的用例,我必须每 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
你可以尝试登录吗? 看看 TimedRotatingFileHandler 可能会有帮助
您能否将 threading.Timer 视为递归的并根据需要设置计时器并在程序启动时调用该函数,您可以更新 array/dict 中的文件名以便将其反映到程序的其余部分,或者您可以将数组的内容写入文件并清空数组。
def write_it():
threading.Timer(300, write_it).start()
write_it()
我使用 RotatingFileHandler 解决了它,它是一个 python 日志 class。我们的范围从 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