ファイルサイズを定期的に記録するPythonスクリプト

現行の進み具合を記録するために作成しました。Windowsのタスク(ってわかりにくい名前だよなあ。タスク定時実行の機能のことです)を使って、1時間おきに記録するようにしています。ファイルが大きくなれば、まあ仕事も進んでいるかな、と。

import sys
import os
import re
import shelve
import time
import datetime

TARGET_DIR = 'c:/home/project/web2.0'

def record():
    l = os.listdir(TARGET_DIR)
    now = datetime.datetime.now()
    sizes = shelve.open(filename=TARGET_DIR + '/log_record', writeback=True)
    for path in filter(lambda f: not re.search('(~$|.bak$|.swp$|record$)', f, re.IGNORECASE), l):
        s = os.stat(TARGET_DIR + '/' + path)
        if not path in sizes:
            sizes[path] = {}
        sizes[path][now] = s.st_size
    sizes.close()

def dump():
    sizes = shelve.open(filename=TARGET_DIR + '/log_record')
    dates = 
    for path in sizes:
        entries = sizes[path]
        for d in entries:
            if not d in dates:
                dates.append(d)
    dates.sort(reverse=True)

    print 'date,',
    for d in dates:
        print str(d) + ',',
    print

    for path in sizes:
        print path+',',
        entries = sizes[path]
        for d in dates:
            if not d in sizes[path]:
                s = 0
            else:
                s = sizes[path][d]
            print str(s) + ',',
        print

    sizes.close()

def today(day):
    sizes = shelve.open(filename=TARGET_DIR + '/log_record')
    todays_first = datetime.datetime.now()
    latest = datetime.datetime(1900,1,1)
    for path in sizes:
        entries = sizes[path]
        for d in entries:
            if d.date() == day and d < todays_first:
                todays_first = d
            if d.date() == day and d > latest:
                latest = d

    results = 
    for path in sizes:
        entries = sizes[path]
        if latest in sizes[path]:
            current = sizes[path][latest]
        else:
            current = 0
        if todays_first in sizes[path]:
            first = sizes[path][todays_first]
        else:
            first = 0
        results.append('%s %d (%d)'%(path, current, (current-first)))

    results.sort()
    for l in results:
        print l

    sizes.close()

if __name__ == '__main__':
    if sys.argv[1] == 'dump':
        dump()
    elif sys.argv[1] == 'record':
        record()
    elif sys.argv[1] == 'today':
        if len(sys.argv) >= 3:
            y,m,d,_,_,_,_,_,_=time.strptime(sys.argv[2], '%Y/%m/%d')
            day = datetime.date(y,m,d)
        else:
            day = datetime.date.today()
        today(day)
    else:
        print 'bad command: ' + sys.argv[1]

コマンドラインから、

python log.py record

とやると、対象ディレクトリの全ファイル(バックアップなどは除く)のサイズをタイムスタンプつきで保存します。いままでの記録を表示するには、

python log.py dump

です。データは、対象ディレクトリに「log_record」というファイル名で保存されます。shelve(ということはpickle)で保存しています。

指定した日の進捗(当日の最初の記録から最後の記録の差)を表示するには、

python log.py today 2006/7/25

日付は省略すると今日になります。