概要
現在Python
を学習していてファイルの読み込みと出力を学習したのでアウトプットしたいと思います。
前提
今回説明するにあたって下記を想定します。
-
ある月の勤怠情報が記録されたCSVファイルから情報を読み込み、
その情報をもとに給与明細っぽいものをテキストファイルに出力する。 -
下記ファイルがあると仮定
working_time.csv
日付,開始時刻,終了時
2022/01/01,9:00,15:00
2022/01/12,10:00,17:00
- 出力は
salary.txt
に出力。 - 時給は2000円。
プログラムの流れ
- 給与情報が記録されたCSVファイルから情報を読み込む
- 読み込んだ情報をもとに月の勤務時間と給与を計算する
- 勤怠の詳細と合わせて勤務時間と給与額をテキストファイルに出力する
出力するレイアウト
出力するレイアウトはざっくり下記のような感じにします。
# 給与明細
## 総勤怠時間
{月の合計時間}時間
## 給与金額
{月の給与金額}円
---勤怠詳細---
日付, 開始時刻, 終了時刻, 勤務時間
oo-oo, 00:00, 00:00, 0.0時間
・
・
・
ファイルの読み込み
まずはworking_time.csv
を読み込みます。
from datetime import datetime
# 時給を定数に格納
HOURLY_PAY = 2000
# 総労働時間の変数を設定
total_working_time = 0
# 勤怠詳細を表すリストを作成
working_details = []
# ファイルを読み込む
with open("working_time.csv", encoding="utf-8") as f:
# 読み込んだCSVファイルを1行ずつ出力
for line in f:
# 行末の改行を削除
row = line.rstrip()
# 取得した行をカンマで区切ってリスト化
cols = row.split(",")
# 開始時刻と終了時刻を文字列からdatetime型に変換
start_time = datetime.strptime(f"{cols[0]} {cols[1]}", "%Y%m%d %H:%M") # ①
end_time = datetime.strptime(f"{cols[0]} {cols[2]}", "%Y%m%d %H:%M") # ①
# 勤怠時間を秒数に変換し、単位を時間に変換
working_time = (end_time - start_time).total_seconds() / 3600
# 勤怠時間を足していく
total_working_time += working_time
# "oo-oo, 00:00, 00:00, 0.0時間"のフォーマットの文字列を作成し、それをworking_detailsに格納
working_details.append(f"{start_time:%m-%d, %H:%M}, {end:%H:%M}, {working_time}時間")
①について下記2点ポイント
- CSVファイルから読み込んだものは
文字列
になるので時間の計算する上でdatetime型
に変換(strptimeメソッド)しないと勤怠時間を求めることができない。 - f.stringを使用して文字列に変数を埋め込む
テキストファイルへの出力
from datetime import datetime
# 先程のファイルの続き
# 給与金額の変数
salary = int(HOURLY_PAY * total_working_time)
# salary.txtに出力
with open("salary.txt", "w", encoding="utf-8") as f:
# 書き込み内容
f.write("# 給与明細\n")
f.write("## 総勤怠時間\n")
f.write(f"{total_working_time}時間\n")
f.write("## 給与金額\n")
f.write(f"{salary:,}円\n")
f.write("---勤怠詳細---\n")
f.write("日付, 開始時刻, 終了時刻, 勤怠時間\n")
# working_detailsの詳細を順番に書き込み
for detail in working_details:
f.write(f"{detail}\n")
下記2点ポイント
-
{salary:,}
の部分は金額を表示するときにカンマで区切ってくれる。
ex) 100,000 -
write
メソッドはprint
と違い改行を末尾につけてくれないので\n
をつけないと改行されない。
これでsalary.txt
に先程記載したレイアウトで出力されます。
まとめ
まだPythonは勉強したばかりなので随時アウトプットしていきたいと思います。
GCPも学んでいるのでそちらもアウトプットしていきたいと思っています。