首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何每10秒将数据写入文件

如何每10秒将数据写入文件
EN

Stack Overflow用户
提问于 2019-03-19 06:43:10
回答 2查看 2.7K关注 0票数 1

我是一个JS,在从事一个从蓝牙温度传感器读取数据的Raspberry-Pi3项目时,试图学习一些Python。

我需要每10秒把数据写到我的file.txt上,我怎么能这样做呢?我在这里找到了类似的主题(每n秒钟运行一次特定的代码 ),但我不知道如何使它在我当前的场景中工作。

代码语言:javascript
复制
#!/usr/bin/env python3

import argparse
import re
import logging
import sys
import time

from btlewrap import available_backends, BluepyBackend, GatttoolBackend, PygattBackend
from mitemp_bt.mitemp_bt_poller import MiTempBtPoller, \
    MI_TEMPERATURE, MI_HUMIDITY, MI_BATTERY

def valid_mitemp_mac(mac, pat=re.compile(r"4C:65:A8:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}")):
    """Check for valid mac adresses."""
    if not pat.match(mac.upper()):
        raise argparse.ArgumentTypeError('The MAC address "{}" seems to be in the wrong format'.format(mac))
    return mac

def poll(args):
    """Poll data from the sensor."""
    backend = _get_backend(args)
    poller = MiTempBtPoller(args.mac, backend)
    line1 = "Temperature: {}".format(poller.parameter_value(MI_TEMPERATURE))
    line2 = "Humidity: {}".format(poller.parameter_value(MI_HUMIDITY))
    print("Getting data from Mi Temperature and Humidity Sensor")
    print("FW: {}".format(poller.firmware_version()))
    print("Name: {}".format(poller.name()))
    print("Battery: {}".format(poller.parameter_value(MI_BATTERY)))
    print(line1)
    print(line2)
    f = open('file.txt', 'w')
    f.write("%s \n %s \n" % (line1, line2))
    f.close()

def _get_backend(args):
    """Extract the backend class from the command line arguments."""
    if args.backend == 'gatttool':
        backend = GatttoolBackend
    elif args.backend == 'bluepy':
        backend = BluepyBackend
    elif args.backend == 'pygatt':
        backend = PygattBackend
    else:
        raise Exception('unknown backend: {}'.format(args.backend))
    return backend


def list_backends(_):
    """List all available backends."""
    backends = [b.__name__ for b in available_backends()]
    print('\n'.join(backends))

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--backend', choices=['gatttool', 'bluepy', 'pygatt'], default='gatttool')
    parser.add_argument('-v', '--verbose', action='store_const', const=True)
    subparsers = parser.add_subparsers(help='sub-command help', )

    parser_poll = subparsers.add_parser('poll', help='poll data from a sensor')
    parser_poll.add_argument('mac', type=valid_mitemp_mac)
    parser_poll.set_defaults(func=poll)

    parser_scan = subparsers.add_parser('backends', help='list the available backends')
    parser_scan.set_defaults(func=list_backends)

    args = parser.parse_args()
    if args.verbose:
        logging.basicConfig(level=logging.DEBUG)

    if not hasattr(args, "func"):
        parser.print_help()
        sys.exit(0)

    args.func(args)


if __name__ == '__main__':
    main()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-19 06:47:41

您可以使用time模块在每次迭代中暂停程序10秒;

代码语言:javascript
复制
from time import sleep

def func(n):
    print(n+1)

for i in range(5):
    func(i)
    sleep(10)

>1
>2
>3
>4
>5

# (every 10 seconds)

然而,这将阻止程序的其余部分运行,尽管调用编写函数的简单多线程脚本就足够了。

对于您使用的代码,将sleep调用插入到poll函数中,并包装您在其中拥有的内容。如果你想循环程序10次,那么;

代码语言:javascript
复制
def poll(args):
    """Poll data from the sensor."""
    for _ in range(10):
        # code things
        f = open('file.txt', 'a') # << Use append here or you will keep overwriting file contents
        f.write('hello')
        f.close()
        sleep(10)

或者,如果您希望它永远运行,直到您的KeyboardInterrupt或退出以某种方式:

代码语言:javascript
复制
def poll(args):
    """Poll data from the sensor."""
    while True:
        # code things
        f = open('file.txt', 'a') # << Use append here or you will keep overwriting file contents
        f.write('hello')
        f.close()
        sleep(10)
票数 3
EN

Stack Overflow用户

发布于 2019-03-19 07:04:54

  1. 您需要某种循环来轮询您的传感器--我没有看到一个人浏览您的代码。在JS中也有时间循环和for循环,如果您不确定语法,也可以在http://docs.python.org/3/tutorial中查找它们。
  2. 存储写入变量的时间,对下一个值进行稍微轮询,检查是否通过了10s,写if,否则不会。(如果不希望打印中间值,则只需在轮询之间休眠10s即可。

关于循环的准备:

代码语言:javascript
复制
import time

def poll():
    return time.time(), 42

last_write = None    # when did we record to file last?

# loop for as long as you want - while True would loop endlessly
for _ in range(7):
    t,c = poll()     # call poll() to get time and temperature from mocked data reader

    # check if enough time has passed
    if last_write is None or (t-last_write) > 2:  # check if new reading needed
        with open("t.txt","a") as f:
            f.write(f"{t}    {c}\n")
        last_write=t
        print("in file ", t,c)            
    else:
        print("just output ", t,c)
    time.sleep(0.7)                               # sleep some

输出:

代码语言:javascript
复制
in file  1552978725.5224085 42                # ...25.5
just output  1552978726.2232893 42            # ...26.2  - not 2s passed 
just output  1552978726.9241226 42            # ...26.9  - not 2s passed
in file  1552978727.6249442 42                # ...27.6  - 2.1s passed 
just output  1552978728.3259027 42            # ...28.3  - not 2s passed
just output  1552978729.0267787 42            # ...29.0  - not 2s passed 
in file  1552978729.7275977 42                # ...29.7  - 2.1s passed

更多评论:

  • 使用with open(filename,mode) as f:和它下面的文件选项-它将在范围之后自动关闭您的文件,并通过关闭文件句柄来处理异常。
  • 在写入文件之前,使用模式"w“将截断文件--您可能需要使用追加:读写文件
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55235039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档