0

我有脚本可以从 Arduino 读取数据并将其保存为 TXT 文件。我还有用于分离数据和添加日期/时间的脚本,而不是保存在新的 TXT 文件中。

我也有一些 Cron 脚本,例如:

  • 每 1 分钟读取一次温度并保存为 TXT 文件(脚本 1)
  • 每 10 分钟读取一次温度并保存为 TXT 文件(脚本 2)
  • 每 60 分钟读取一次温度并保存为 TXT 文件(脚本 3)

我想做一些图表:

  • 最近一小时的温度
  • 最近 3 小时内的温度
  • 过去 12 小时内的温度
  • 过去 24 小时内的温度
  • 最近 7 天的温度

所以我需要新的 Python 脚本来:

  • 从脚本 1 中获取最后 60 行 - 将其保存为新的 TXT 文件,以将其用作图表“上一小时的温度”

  • 从脚本 2 中获取最后 18 行 - 将其保存为新的 TXT 文件,将其用作图表“过去 3 小时内的温度”

  • 从脚本 2 中获取最后 72 行 - 将其保存为新的 TXT 文件,以将其用作图表“过去 12 小时内的温度”

  • 从脚本 2 中获取最后 144 行 - 将其保存为新的 TXT 文件,将其用作图表“过去 24 小时内的温度”

  • 从脚本 3 中获取最后 168 行 - 将其保存为新的 TXT 文件以将其用作图表“过去 7 天的温度”

你能帮我写一个简单的脚本,例如从 FILE.txt 获取最后 60 行并将它们保存为 FILE2.txt 吗?我将为我需要的下一个脚本编辑它。

编辑:我可能知道如何保持图表文件的大小(60 行),但现在我想问是否可以制作任何脚本,谁将删除前 30 行?

我只有大约 1 GB 的空间,所以我需要清理 TXT 文件;)如果两周后我每分钟都会有温度,它会填满我的硬盘;)

所以我认为从 txt 文件中删除前 X 行的 CRON 操作对我有很大帮助。你知道任何脚本吗?

如果我能得到它,我将最终完成我的主项目,当然我会向你展示结果:)

4

3 回答 3

1

你可以使用这里的tail食谱collections.deque

from collections import deque

def tail(filename, n=10):
    with open(filename) as f:
        return deque(f, n)

lines = tail("script",18)
于 2013-05-11T08:00:30.847 回答
0

这是我对 glenbot 想法的看法:

import os

def tail(f, n=1, _buffer=1):
    """Tail a file and get X lines from the end"""
    # place holder for the n found
    lines = []

    block_counter = -1

    while True:
        try:
            f.seek(block_counter * _buffer, os.SEEK_END)
        except IOError:  # either file is too small, or too many n requested
            f.seek(0)
            return f.readlines()

        lines = f.readlines()

        # we found enough, get out
        if len(lines) > n:
            return lines[-n:]

        # decrement the block counter to get the next X bytes
        block_counter -= 1
于 2013-05-11T08:12:37.033 回答
0

这是你的小程序,只需在 cron 中每隔一分钟运行一次

#!/usr/bin/env python
from random import randrange
import datetime

now = datetime.datetime.now()

#generate random temperature
temperature = randrange(50, 100)

#database structure
structure = "{'last_hour': [], 'last_3_hours': [], 'last_12_hours': [], " \
            "'last_24_hours': [], 'last_7_days': []}"

#file for the database
database = 'temperature_database.txt' #use absolute path when running from cron

#check database file exists, if not write the database structure
try:
    with open(database): pass
except IOError:
    with open(database, 'w') as handler:
        handler.write(structure)

#read the contents of the database
with open(database, 'r') as handler:
    db_contents = eval(handler.read())

#first save every minute
db_contents['last_hour'].append(temperature)
if len(db_contents['last_hour']) > 60:
    db_contents['last_hour'] = db_contents['last_hour'][-60:] #get the last 60 elements

if now.minute in [10, 0]: #every ten minutes
    db_contents['last_3_hours'].append(temperature)
    if len(db_contents['last_3_hours']) > 18:
        db_contents['last_3_hours'] = db_contents['last_3_hours'][-18:]

    db_contents['last_12_hours'].append(temperature)
    if len(db_contents['last_12_hours']) > 72:
        db_contents['last_12_hours'] = db_contents['last_12_hours'][-72:]

    db_contents['last_24_hours'].append(temperature)
    if len(db_contents['last_24_hours']) > 144:
        db_contents['last_24_hours'] = db_contents['last_24_hours'][-144:]

if now.minute == 1: #every hour
    db_contents['last_7_days'].append(temperature)
    if len(db_contents['last_7_days']) > 168:
        db_contents['last_7_days'] = db_contents['last_7_days'][-168:]

#save the contents to the database
with open(database, 'w') as handler:
    handler.write(str(db_contents))

四分钟后,文件包含

{'last_hour': [62, 99, 83, 71], 'last_12_hours': [], 'last_24_hours': [], 'last_3_hours': [], 'last_7_days': []}
于 2013-05-11T08:47:46.990 回答