2013年3月6日水曜日

Twitterから読み出したデータを保存するスクリプト

室温・湿度・大気圧のデータを Arduino から Twitter に投稿できるようになったので、Twitter からデータを読み込んで PC に保存するスクリプトを作りました。



一行ずつ読み込んだデータを必要な項目に分割して、日付がキーのディクショナリに入れたあと、日付毎のファイルに書き出しています。同名のファイルが既に存在すれば追加で書き込みます。
前回どこまで読み込んだかを管理するのが面倒(というか、どうやったら出来るのかがわからない)なので、直近2日分のデータを読み出してファイルに書き込んでから、シェルコマンドでソートと重複行の削除をおこなうという横着なつくりです。

MacBook Pro の launchd で6時間おきに(常時起動している訳ではないので…)実行するようにして4日目ですが、順調にデータを収集してくれています。
はじめてpythonでプログラムを書きましたが、あまりにも簡単に書けてしまって驚いています。同じものをCで書くなら文字列を分割するあたりで挫けてしまうところです。
腕のいいpaython使いの人ならもっとずっと簡潔にかけるのでしょうけれど。
#!/opt/local/bin/python
# -*- coding: utf-8 -*-
#
# Twitter タイムラインからデータを取得して日付毎のファイルに保存する。
# その際にデータのソートと重複データの除去をおこなう。
#
# getdata.py
#
#
# Twitter のレコードは "2013/ 2/28 20:50:00 現在の室温は 23.2℃、
# 湿度は26.5%RH、気圧は1007.1hPaです。" という文字列なので、
# この文字列を re.search() の正規表現による文字列分割で 年、月、日、
# 時、分、気温、湿度、気圧に分割する。
#
# 出力ファイル名は"yyyy-mm-dd.data" で既に同名のファイルが存在すれば
# 追記する。
#

import sys
import os
import tweepy
import re
import datetime
import keys

DATA_DIR = '~/weatherlog/'      # データ保存用ディレクトリ
DATA_EXT = '.data'              # デーファイル拡張子

class Data:
    def __init__(self, date, time, temperature, humidity, pressure):
        self.date = date
        self.time = time
        self.t = temperature
        self.h = humidity
        self.p = pressure


def OAuth():
    auth = tweepy.OAuthHandler(keys.CONSUMER_KEY, keys.CONSUMER_SECRET)
    auth.set_access_token(keys.ACCESS_KEY, keys.ACCESS_SECRET)
    api = tweepy.API(auth)
    return api


def main():
    print '%s : getdata.py start...' % datetime.datetime.now()
    r = re.compile("([0-9]+)/[ ]?([0-9]+)/[ ]?([0-9]+)[ ]+([0-9]+):([0-9]+).*? ([0-9\.]+).*?([0-9\.]+).*?([0-9\.]+)")
    data_dict = {}
    api = OAuth()
    # データ取得
    for i, p in enumerate(tweepy.Cursor(api.home_timeline).items(288)):
        m = r.search(p.text)
        #print '[' + p.text + ']'
        if m:
            date = "%4s-%02d-%02d" % \
              ( m.group(1), int(m.group(2)), int(m.group(3)))
            time = "%02d:%02d" % \
              ( int(m.group(4)), int(m.group(5)))
            temperature = m.group(6)
            humidity = m.group(7)
            pressure = int(round(float(m.group(8))))
            data = Data(date, time, temperature, humidity, pressure)
            #print u'%4d: %s %s %4s度 %4s% %4dhPa' % \
            #  (i, date, time, temperature, humidity, pressure)
            if date in data_dict:
                data_dict[date] += [data]
            else:
                data_dict[date] = [data]
        else:
            #print '%4d: 有効なデータではありません' % i
            pass

    # ファイルへ出力
    for date in sorted(data_dict):
        #print '[' + date +']'
        fname = os.path.expanduser(DATA_DIR) + date + DATA_EXT
        ftmp  = os.path.expanduser(DATA_DIR) + 'tmp' + DATA_EXT
        f = open(ftmp, 'w')
        for d in reversed(data_dict[date]):
            f.write("%s %s %s %s %s\n" % (d.date, d.time, d.t, d.h, d.p))
            #print "%s %s %s %s %s" % (d.date, d.time, d.t, d.h, d.p)
        f.close()
        if os.path.exists(fname):
            os.system('cat ' + fname + ' >> ' + ftmp)
        os.system('sort < ' + ftmp + ' | uniq > ' + fname)
        os.system('rm ' + ftmp)
    print '%s : finish' % datetime.datetime.now()


if __name__ == "__main__":
    main()

0 件のコメント: