はじめに
私が在籍しているHappiness Chainというプログラミングスクールでは、学習した日に日報を提出します。日報には今日の学習時間と、入会してからの累計学習時間を記入します。
この累計学習時間を毎回計算するのが面倒だったので、先日、計算用のシェルスクリプトを作りました。
このシェルスクリプトでは、最新の累計学習時間をテキストファイルにリダイレクトして上書きしています。
これを見た他の受講生の方に「学習時間の積み上げが可視化できるように、上書きではなくテキストファイルに追記していく形式が良いのでは」というアイディアをもらいました。
個人的には、最新の累計学習時間がトップにある方が見やすいので、以下のように出力されるようにしたいと思います。
773h42m
771h42m
770h40m
760h38m
...
また、シェルスクリプトよりもPythonの方が絶対に簡単に書けると思ったので、今回はPythonで作成してみました。
完成したコード
ファイルの先頭に追記するのにtextfile
パッケージを使用しているため、インストールが必要です。
$ pip install textfile
コードに関する説明はコメントに記載しています。
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。
773h42m
引数に今日の学習時間を指定して実行すると、累計学習時間を計算し、ターミナルに表示しlog.txt
の先頭に記入します。
$ python calc_times.py 1h02m
774h44m
774h44m
773h42m
補足
以下のように、時間か分どちらかのみだけでも計算できます。
$ python calc_times.py 1h
$ python calc_times.py 45m
分を0埋めしていなくても問題ありません。
$ python calc_times.py 1h2m
終わりに
簡単なプログラムでも自分の役に立つものを作ることができるのは嬉しいですね!
そしてやはり、Pythonの方がシェルスクリプトより圧倒的に書きやすかったですw
参考
-
空の場合は0h0mと見做されます。 ↩