5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python】累計学習時間と今日の学習時間を合計するプログラムを作った

Last updated at Posted at 2024-02-02

はじめに

私が在籍しているHappiness Chainというプログラミングスクールでは、学習した日に日報を提出します。日報には今日の学習時間と、入会してからの累計学習時間を記入します。

46be4c69-bd21-3e89-12b7-7db98a2a22e3.png

この累計学習時間を毎回計算するのが面倒だったので、先日、計算用のシェルスクリプトを作りました。

このシェルスクリプトでは、最新の累計学習時間をテキストファイルにリダイレクトして上書きしています。

これを見た他の受講生の方に「学習時間の積み上げが可視化できるように、上書きではなくテキストファイルに追記していく形式が良いのでは」というアイディアをもらいました。

個人的には、最新の累計学習時間がトップにある方が見やすいので、以下のように出力されるようにしたいと思います。

log.txt
773h42m
771h42m
770h40m
760h38m
...

また、シェルスクリプトよりもPythonの方が絶対に簡単に書けると思ったので、今回はPythonで作成してみました。

完成したコード

ファイルの先頭に追記するのにtextfileパッケージを使用しているため、インストールが必要です。

$ pip install textfile

コードに関する説明はコメントに記載しています。

calc_times.py
import sys
import textfile

def main(todays_time):
    # 記録用ファイルのパスを指定
    log_file = 'log.txt'
    # 最新の累計時間をファイルから取得
    f = open(log_file, 'r')
    current_total = f.readline()
    # ファイルが空なら0h0m扱い
    if not current_total:
      current_total = "0h0m"
    f.close()

    # 時刻補正
    hours1, minutes1 = time_correction(current_total)
    hours2, minutes2 = time_correction(todays_time)

    # 学習時間を足す
    total_hours = hours1 + hours2
    total_minutes = minutes1 + minutes2

    # 60分以上なら時間に補正
    if total_minutes >= 60:
        total_hours += total_minutes // 60
        total_minutes %= 60

    # 結果を表示
    result = f"{total_hours:02d}h{total_minutes:02d}m"
    print(result)

    # 結果をファイルの先頭に書き出し
    textfile.insert(log_file, result+'\n', line=0)

def time_correction(time_entered):
    """
    時刻補正用関数

    :param time_entered : "1h02m"のような時刻を表す文字列
    :type time_entered: string
    :returns 時間数と分数
    :rtype: tuple
    """
    # hがなければ0hを追加
    if not "h" in time_entered:
        time_entered = '0h' + time_entered
    # mがなければ0mを追加
    elif not "m" in time_entered:
        time_entered = time_entered + '0m'
    hours = int(time_entered.split('h')[0])
    minutes = int(time_entered.split('h')[1].split('m')[0])
    return hours, minutes

if __name__ == '__main__':
    # 引数チェック
    args = sys.argv
    if len(args) <= 1:
        print("Enter today's study time in a format such as '1h02m'.")
    elif len(args) > 2:
        print("Too many arguments")
    else:
        main(args[1])

利用例

log.txtを作成し、累計学習時間を記入しておきます1

log.txt
773h42m

引数に今日の学習時間を指定して実行すると、累計学習時間を計算し、ターミナルに表示しlog.txtの先頭に記入します。

$ python calc_times.py 1h02m
774h44m
log.txt
774h44m
773h42m

補足

以下のように、時間か分どちらかのみだけでも計算できます。

$ python calc_times.py 1h
$ python calc_times.py 45m

分を0埋めしていなくても問題ありません。

$ python calc_times.py 1h2m

終わりに

簡単なプログラムでも自分の役に立つものを作ることができるのは嬉しいですね!

そしてやはり、Pythonの方がシェルスクリプトより圧倒的に書きやすかったですw

参考

  1. 空の場合は0h0mと見做されます。

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?