jiku log

データサイエンスの核心を掴む : 学びと発見の記録

「PythonでつくるWebアプリのつくり方」を読む ~Chap.4 実践Webアプリを作ってみよう ②カレンダーアプリ ~

はじめに

クジラ飛行机、 杉山 陽一、遠藤 俊輔 著「PythonでつくるWebアプリのつくり方」を読み,Pythonを使ったWebアプリ開発の基礎を学ぶことにした。

本記事は,「chapter4 実践Webアプリを作ってみよう」における,カレンダーアプリに関する読書メモである。

本記事を読むことで得られること

本記事を読むことで得られることは,主に以下の内容である。

  • Pythonの標準ライブラリにあるカレンダー機能
  • JSONファイル読込み時の注意点

02 カレンダーアプリを作ってみよう

要点

calendarモジュール

本節では,Pythoncalendarモジュールを用いたカレンダーの作成方法について説明している。
calendarモジュールは,一般的なカレンダーに関する機能群を提供している。特に,calendar.HTMLCalendarクラスは,HTMLのカレンダーを作成するためのクラスである。

iCal形式の出力機能

iCal(iCalendar)」形式は,拡張子が「.ical」や「.ics」のファイル形式であり,Google CalendarApple Calendarなどが入出力に対応している。
iCalのデータは以下のような構造になっている。

BEGIN:VCALENDAR
VERSION:2.0
PRODID: calendar_events
BEGIN:VEVENT
DTSTART;VALUE=DATE:20240820
DTEND;VALUE=DATE:20240820
SUMMARY:Dランドに行く
END:VEVENT
...
END:VCALENDAR
  • カレンダー全体は,BEGIN:VCALENDAR~END:VCALENDARの範囲で定義される。
  • 1つのイベントは,BEGIN:VEVENT~END:VEVENTの範囲で定義される。
  • 複数のイベントがある場合は,BEGIN:VEVENT~END:VEVENTが繰り返される。

という形式になっている。

本節の気付き : シンプルなカレンダー

シンプルなカレンダーアプリを実行すると,以下のように表示される。

このカレンダーをHTMLで出力する部分は,

    html = calendar.HTMLCalendar().formatmonth(year, month)

のように,年と月を指定することで出力できる。

本節の気付き : 予定の書き込みができるカレンダー

エンコードの指定

本書のP196を参考に,ソースコードのsrc\ch4\calendar_events.py を動かそうとしたところ,以下のようなエラーメッセージが表示された。

Traceback (most recent call last):
  File "c:\workspace_python\flask_workspace\src\ch4\calendar\calendar_events.py", line 12, in <module>
    events = json.load(f)
             ^^^^^^^^^^^^
  File "C:\Users\yosch\AppData\Local\Programs\Python\Python312\Lib\json\__init__.py", line 293, in load
    return loads(fp.read(),
                 ^^^^^^^^^
UnicodeDecodeError: 'cp932' codec can't decode byte 0x87 in position 69: illegal multibyte sequence

エンコーディングのエラーを起こしていたので,以下のようにイベントデータのjsonファイルの読み込みの際にエンコードを指定するように修正してみた。

  • 修正後
# イベントデータをファイルから読む --- (※2)
events = {}
if os.path.exists(SAVE_FILE):
    #with open(SAVE_FILE, "r") as f:
    with open(SAVE_FILE, "r", encoding="utf-8") as f:
        events = json.load(f)

その結果,無事にカレンダーが表示された。

まとめと感想

今回は,「chapter4 実践Webアプリを作ってみよう」における,カレンダーアプリについてまとめた。

pythonのcalendarライブラリを使うことによって,カレンダーを計算するだけでなくHTMLで出力できるというのはとても驚いた。カレンダーアプリを作る機会は少ないと思うが,開発したアプリの中で日付や時刻情報を管理したいときはあると思うので,その際にはこのライブラリを活用したい。

JSON形式で保存された予定表を読み込むときには,エンコーディングが問題になった。ファイル読込みが発生する際には,エンコードに気を遣うようにしたい。

本記事を最後まで読んでくださり,どうもありがとうございました。