Python2行でカレンダー

今回は、Pythonで手軽に卓上カレンダーを作る方法を紹介する。Pythonのcalendarモジュールを利用すれば、手軽にカレンダーを出力できる。しかも、プログラムを二行書くだけだ。今回はPythonでいろいろなカレンダーを表示する方法を紹介しよう。

さっそく、カレンダーを表示する二行のプログラムを書いてみよう。Pythonに付属しているIDLEシェルを起動して、以下の二行を入力してみよう。

 import calendar
 print(calendar.month(2018, 1))

IDLEで実行すると、以下のようなカレンダーが表示される。

  • たった二行書くだけでカレンダーが表示される

    たった二行書くだけでカレンダーが表示される

使い方だが、以下のような書式で記述する。

 calendar.month(年, 月, w=列幅, l=行数)

キーワード引数のwやlを指定すると、カレンダーを出力するとき、各日ごとの出力幅を調整できる。以下は、w=7とl=2を指定する例だ。

 print(calendar.month(2018, 1, w=7, l=2))     

実行すると、以下のように表示される。

  • wやlの引数を指定して出力したところ

    wやlの引数を指定して出力したところ

printすら省略できる

しかも、printでさえも省略して出力できるように、calendar.prmonth()関数が用意されている。引数は、month()関数と同じだ。

以下は、2018年1月の月間カレンダーを出力するプログラムだ。

 calendar.prmonth(2018, 1, w=7)

IDLE上で試してみよう。とても簡潔にカレンダーを出力できる。

  • prmonthを使えばprintさえも省略できる

    prmonthを使えばprintさえも省略できる

あまりにも簡単なので、ひょっとすると、普段からIDLEやターミナルでPythonを起動しっぱなしの達人たちは、カレンダーのアプリを立ち上げるよりも、このcalendar.prmonth()を実行した方が早いと思っているかもしれない(笑)。

ターミナルで出力すれば見栄えをカスタマイズできる

今度は、IDLEターミナル上でカレンダーを表示してみよう。以下は、レトロなターミナルとして人気の「cool-retro-term」を使ってカレンダーを表示してみたところだ。ターミナルを起動したら「python」コマンドを実行して、対話実行環境(REPL)を起動しよう。その上で、同じように、calendar.prmonth()関数を実行して、カレンダーを表示してみよう。

  • ターミナル上でprmonthを使ったところ

    ターミナル上でprmonthを使ったところ

また、多くのターミナルでは、背景に画像を設定できるようになっている。そこで、ターミナルの背景に桜の写真画像を設定した上で、2018年4月のカレンダーを出力してみた。わずか2行のプログラムでも、やはり、画像と組み合わせるのは楽しいものだ。

  • 背景画像を設定してみたところ

    背景画像を設定してみたところ

Webブラウザに出力すればさらに見栄えよくできる

また、少しコードを書き加える必要があるが、Webブラウザにカレンダーを出力すれば、さらに見栄えの良さをカスタマイズできる。以下のプログラムを実行すると「calendar201801.html」というHTMLファイルを出力する。

 # 月間カレンダーを作る --- (*1)
 import calendar
 lc = calendar.HTMLCalendar()
 body = lc.formatmonth(2018, 1)

 # ファイルに保存 --- (*2)
 f = open("calendar201801.html", "wt")
 f.write("<body>" + body + "</body>")

生成されたHTMLファイルをWebブラウザにドラッグ&ドロップすると、カレンダーが表示される。以下が、ブラウザに表示したところだ。

  • HTMLで画像を出力

    HTMLで画像を出力

Google Chromeであれば、ブラウザを右クリックしてポップアップメニューから「検証」をクリックしてみよう。どんなHTMLの構造になっているのか確認できる。

プログラムも確認してみよう。calendarモジュールのHTMLCalendarを利用する。プログラムの(*1)の部分では、このオブジェクトを作成し、formatmonth()メソッドを呼びだすと、手軽にカレンダーをHTMLで生成できる。(*2)の部分では、生成したHTMLをファイルに保存する。ここでは、指定していないが、<style>タグを書き加えると、デザインを細かくカスタマイズできる。

それでは、次に、以下のような年間カレンダーを作成してみよう。Webブラウザ向けにHTMLを出力すれば、カレンダーの閲覧も手軽である上に、印刷も簡単だ。

  • Webブラウザ向けの年間カレンダー

    Webブラウザ向けの年間カレンダー

この年間カレンダーを作成するプログラムは、以下のようになる。

 # 日本語のカレンダーを作る --- (*1)
 import calendar
 lc = calendar.HTMLCalendar()
 body = lc.formatyear(2018, width=4)

 # HTMLのヘッダとフッタを指定 --- (*2)
 html = """<html><head><style>
 table { padding: 8px; }
 th { border-bottom: 1px solid gray; }
 td { padding: 4px; vertical-align: top; }
 .sun { color: red; }
 .sat { color: blue; }
 </style></head><body>""" + body + """
 </body></html>"""

 # ファイルに保存 --- (*3)
 f = open("calendar2018.html", "wt")
 f.write(html)

今回のメインプログラムが(*1)の部分となる。calendar.HTMLCalendar()を実行すると、HTMLを出力するローカル・カレンダーのオブジェクトを作成する。そして、formatyear()メソッドを使って、カレンダー向けのHTMLを出力する。そして、(*2)の部分では、ヘッダとフッタをつけて完全なHTMLを作る。そして、(*3)の部分で、HTMLをファイルに保存する。

ちなみに、(*2)の部分で<style>タグを定義している。この部分を書き換えることで、カレンダーの色やサイズを変更することができる。

まとめ

以上、今回はcalendarモジュールを使って、カレンダーを作成する方法を紹介した。二行のプログラムを書くだけで、簡単なカレンダーを出力できるので便利だ。また、HTMLを出力する、HTMLCalendar を利用すれば、かなり自由度の高いカスタマイズが可能だ。手軽にカレンダーを出力できるので試してみて欲しい。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2005年IPAスーパークリエイター認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。