やりたいこと
打刻時間をcsvに記憶してくれる打刻システムを作りたいです。
入力した名前.csvで保存します。
- 初めてor出勤時に打刻した時は日付、出勤時間をcsvに書き込みます。
- 退勤時に打刻した時は退勤時間、(残業があれば)残業時間をcsvに書き込みます。
- 17:00~17:05は乖離時間として扱うため、この時間の退勤打刻は17:00として処理されます。
分からないこと
- 退勤打刻の時に、出勤打刻した日と同じ列に出力したいのですが上手くいきません。
どうしても打刻ごとに改行されてしまいます。
2. 残業時間がない場合は書き込みをしたくないのですが、どのように処理して良いのかわかりません。
コード
Python
1import csv 2import datetime 3import os 4 5# 打刻する人の名前を入力して打刻処理を始める 6input_name = input('write your name:') 7 8# 打刻した人の名前を取得 9def Engraving_name(input_name): 10 return input_name 11 12# 打刻した日付(year/month/day)を取得 13def Engraving_day(): 14 now = datetime.datetime.now() 15 day = now.strftime('%Y/%m/%d') 16 return day 17 18def attendance_time(): 19 now = datetime.datetime.now() 20 attendance = now.time() 21 return attendance.strftime('%H:%M') 22 23# 打刻した時間(hour:min)を取得して 24# 17:01~17:05であれば乖離時間として扱い、17:00にする 25def retirement_time(): 26 now = datetime.datetime.now() 27 engraving = now.time() 28 on_time = datetime.time(hour=17, minute=0) 29 deviation = datetime.time(hour=17, minute=5) 30 if on_time <= engraving <= deviation: 31 return on_time.strftime('%H:%M') 32 elif engraving > deviation: 33 return engraving.strftime('%H:%M') 34 else: 35 return engraving.strftime('%H:%M') 36 37# 17:05を超えた時間を残業時間として分単位で取得する 38def over_time(): 39 now = datetime.datetime.now() 40 over_time_count = now - datetime.timedelta(hours=17, minutes=5) 41 return over_time_count.hour * 60 + over_time_count.minute 42 43# 打刻時間をcsvファイルに出力して保存する 44# 初めての打刻であればテンプレを作成する 45if not os.path.exists(input_name + '_Engraving.csv'): 46 with open(input_name + '_Engraving.csv', 'w') as csv_file: 47 fieldnames = ['Day', 'AttendanceTime', 'RetirementTime', 'OverTime(min)'] 48 writer = csv.DictWriter(csv_file, fieldnames=fieldnames) 49 writer.writeheader() 50 writer.writerow( 51 {'Day': Engraving_day(), 52 'AttendanceTime': attendance_time(), 53 } 54 ) 55# 初めての打刻でなければ追記する 56else: 57 with open(input_name + '_Engraving.csv', 'a') as csv_file: 58 fieldnames = ['Day', 'AttendanceTime', 'RetirementTime', 'OverTime(min)'] 59 writer = csv.DictWriter(csv_file, fieldnames=fieldnames) 60 61 # 最新のAttendanceTimeとRetirementTimeに打刻時間があるかどうか調べるために 62 # AttendanceTimeとRetirementTimeの列をリストに入れる 63 with open(input_name + '_Engraving.csv') as f: 64 reader = csv.reader(f) 65 attendance_check = [] 66 retirement_check = [] 67 for row in reader: 68 attendance_check.append(row[1]) 69 retirement_check.append(row[2]) 70 71 # 最新のRetirementTimeに空があるならif文を、そうでなければelse文を実行 72 if retirement_check[len(retirement_check)-1] == '': 73 retirement_check[len(retirement_check) - 1] = retirement_time() 74 print(retirement_check) 75 else: 76 writer.writerow( 77 {'Day': Engraving_day(), 78 'AttendanceTime': attendance_time()} 79 )
回答1件
あなたの回答
tips
プレビュー