0

Arduinoからデータを読み取り、TXTファイルとして保存するスクリプトがあります。新しいTXTファイルに保存するよりも、データを分離して日付/時刻を追加するスクリプトもあります。

次のようなCronスクリプトもいくつかあります。

  • 1 分ごとに温度を読み取り、TXT ファイルとして保存します (スクリプト 1)
  • 10 分ごとに温度を読み取り、TXT ファイルとして保存します (スクリプト 2)
  • 60 分ごとに温度を読み取り、TXT ファイルとして保存します (スクリプト 3)

いくつかのチャートを作成したいと思います:

  • 過去 1 時間の気温
  • 過去 3 時間の気温
  • 過去 12 時間の気温
  • 過去 24 時間の気温
  • 過去 7 日間の気温

したがって、次のことを行う新しい Python スクリプトが必要です。

  • スクリプト 1 から最後の 60 行を取得 - 新しい TXT ファイルとして保存し、チャート「過去 1 時間の温度」として使用します

  • スクリプト 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 ファイルを消去する必要があります;) 2 週間後に毎分温度を取得すると、ハード ドライブがいっぱいになります;)

したがって、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

これが小さなプログラムです。cronで1分ごとに実行してください

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

4 分後、ファイルには

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

グレンボットのアイデアの私のバージョンは次のとおりです。

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 に答える