Skip to main content
 首页 » 编程设计

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

2025年05月04日20java哥

我是一名 JS 开发人员,在从事从蓝牙温度传感器读取数据的 Raspberry-Pi3 项目时,我正在尝试学习一些 Python。

我需要每 10 秒将数据写入我的 file.txt,请问我该怎么做?我在这里找到了类似的主题 ( Run certain code every n seconds ),但我不知道如何让它在我当前的场景中工作。

#!/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() 

请您参考如下方法:

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

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 次;

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 或以某种方式退出:

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)