Python watchdog でファイル監視して自動処理

仕事の関係でテキストファイルを html ファイルに変換する処理を日常的に繰り返していて、Python で書いた変換するスクリプトを毎分実行するということをやっていました。その目的としてはそれで事足りていたのですが、別件でもファイルの更新を検知して処理したいなーと思っていたものがあり、たまたま Qiita で watchdog の使用例を書いた記事を見つけたのでやってみることにしました。

会社で使っている Python のスクリプトを全部(といってもそんなに数はないですが)3.x 系で統一しようと思っているので 3.x 系の virtualenv 環境でインストールしたところエラーになりました。下記のような参考になりそうな情報もあったのですが、私の環境ではうまくいかなかったので 2.x 系の環境に入れました。

基本的に Qiita の記事および公式ドキュメントのサンプルそのままです。ChnageHandler というクラスの中で on_modified とか on_created などのメソッドを定義してそこに処理を書きます。下記のコードだとこのスクリプトを置いているディレクトリにある something.txt についての ...

more ...

Project Euler で基礎体力をつける

mizchi さん の何かの発表資料スライドを見ていたら Project Euler でプログラミングの基礎的な力を培ったという趣旨の内容がありました。

Project Euler(プロジェクト・オイラー)とは、数学者・物理学者 のオイラーから名前を取っていて数学的なプログラミングの問題を出題しているサイトです。設問と回答投稿フォームがあり、手元で解いた答えを入力して投稿すると正否を判定してくれます。

その名前は何となく知っていましたが実際に試したりしたことはなかったので、これもいい機会だと思い、挑戦することにしました。

現在 460 ほどの問題が掲載されていて、解いた数によってレベル分けがあり、最高のレベル 17(= 425 問以上を解いている)に該当するのは、参加登録をしている約 380,000 人のうち 70 人のみということでした。日本の方も 6 名いるようです。

昨晩から始めて 2 問解いて、3 問目で躓き、うんうん悩みながら試していて ...

more ...

reStructured Text で HTML を直接書く

reST や Markdown といった軽量マークアップ言語は HTML を手書きしなくてもよい(= シンプルなマークアップで HTML に変換してくれる)ところが利点ですが、それでも文書を書いているときに HTML をそのまま書きたいこともあります。

例えば、Amazon などの商品リンクを載せようと思ったら amazlet などを利用して(Amazon 純正でもいいですけれど)紹介用の HTML タグを取得することが多いと思います。それを reST ファイルの中で利用するにはどうしたらよいのでしょうか。

調べたところ、raw ディレクティブ(.. のあとに続けて書くアレ)を使えばいいそうです。

.. raw:: html

   <iframe width="560" height="315" src="//www.youtube.com/embed/-x640lbMucc" frameborder="0" allowfullscreen></iframe>

これで OK ...

more ...

Python 現在時刻を表示する(文字列のフォーマット)

日時や時刻を数値データとして取得するだけではなく文字列として表示するやり方について書いてみます。datetime オブジェクトの strftime() メソッドを使います。

strftime() は引数にフォーマット文字列を取ります。公式ドキュメントに詳細な説明があるのでそれを見ながら %Y などの指定子を組み立てていきます。

import datetime
d = datetime.datetime.today()
print('d.strftime():', d.strftime('%Y/%m/%d %H:%M:%S'))
d.strftime(): 2014/04/02 01:12:16

個人的にはこれを覚えておけば大体大丈夫かなという気がしています ...

more ...

Python 現在時刻を表示する

スクリプトを書いていて現在時刻を表示したいことがあります。Python では datetime モジュールによって簡単に実現できるのでメモしておきましょう。

import datetime
d = datetime.datetime.today()
print('d:', d)
d: 2014-04-01 23:31:39.463726

datetime.datetime.today() というメソッドで現在の日時を取得できました。もうひとつ datetime.datetime.now() というメソッドもあり、こちらは引数にタイムゾーンを指定できるようです。何も指定しなければ today() の方と同じものが返ってきます。

now = datetime.datetime.now()
print('now:', now)
now: 2014-04-01 23:31:41.464821

これらの戻り値の型は datetime.datetime オブジェクトで ...

more ...

自分でルールを決める(そして守る)

自分の行動を変える

自分の日々の行動をより高い精度でコントロールしたいと思っています。そうすることで今よりもアウトプットの量、あるいは質が改善できるのではないかと考えているからです。

やるべきことをやり(行動を増やし)、すべきでないことはしない(行動を減らす)、言葉にするとシンプルで難しいことでも何でもないのですが、これぞまさに言うは易く行うは難しでなかなか思うようには律することができません。

やることもやらないことも、頭のなかに置いておくだけでは全く不十分だろうという気がしています。

紙に書いて張り出しておくなど可視化したり、定期的にリマインダを設定したり、常にそのことが意識に上っているように自分で環境を整える必要がありそうです。

目標ではなくルールを定める

そういうことは少し前から考えてはいたのですが、そこに追加でひとつ思ったのは、それらは努力目標などではなく、守るべきルールとして定めるのがよいのではないかということです。

やはり「○○しよう」といった努力目標的な statement だと、何かイレギュラーがあったときに「今日くらいはいいか」などとついつい自分に甘くしてしまいがちです(私だけかもしれませんが)。

自らの意志の力はあまり頼りにせず、ルールで自分を縛るように考えたほうが、易きに流されやすい私には合っているのかなと。

書いてみると全く当たり前のことではありますが、気づいた記録に、そして宣言の場として blog に書いておきます。

more ...

Python デコレータを学ぶ 3

デコレータで引数を取るのではなく、デコレートされる関数の方で引数を取って、それをデコレータ側でも使用する場合については以下のようになるようです。

# デコレータ
def how_are_you(func):
    def wrapper(arg1, arg2):
        print('I got args! Look:', arg1, arg2)
        func(arg1, arg2)
        print('how are you,', arg1, '?')
    return wrapper


# デコレートされる関数
@how_are_you
def greeting(first_name, last_name):
    print('hello,', first_name, last_name)

# 実行する
greeting('Jude', 'Law')

実行した結果はこうなります。

$ python decolate.py

I got args! Look ...
more ...

Python デコレータを学ぶ 2

デコレータに引数を渡す場合について「パーフェクト Python」に説明がありました。デコレータをさらにラップする関数を用意してそこで引数を受け取るようにすればよいみたいです。

# デコレータをラップした関数。引数 text を取る。
def show_message(text):
    def deco(func):
        def wrapper():
            print(text)
            return func()
        return wrapper
    return deco

デコレートされる関数を定義します。

@show_message('spam() called.')
def spam():
    print("Spam!")

# 実行する
spam()

すると引数で渡したテキスト 'spam() called.' を使ってデコレートできていることがわかります。

$ python decolate.py
spam() called.
Spam!

ふむふむ。

more ...