🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2927閲覧

Python CSVファイルの任意の行列マスに書き込みをしたい

yusuke.y

総合スコア17

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/09/08 15:51

編集2019/09/09 08:58

やりたいこと

打刻時間をcsvに記憶してくれる打刻システムを作りたいです。
入力した名前.csvで保存します。

  1. 初めてor出勤時に打刻した時は日付、出勤時間をcsvに書き込みます。
  2. 退勤時に打刻した時は退勤時間、(残業があれば)残業時間をcsvに書き込みます。
  3. 17:00~17:05は乖離時間として扱うため、この時間の退勤打刻は17:00として処理されます。

分からないこと

  1. 退勤打刻の時に、出勤打刻した日と同じ列に出力したいのですが上手くいきません。

どうしても打刻ごとに改行されてしまいます。
イメージ説明
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 )

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2019/09/09 02:17

追記しようとしていますが、改行コードも追加されているからではないですか?この点は理解されていますか?
yusuke.y

2019/09/09 08:10 編集

writerowで新しい行に生成するのは理解しております。 writerowを使わずに追記する方法がわからないです。
t_obara

2019/09/10 01:09

テンポラリファイルを新規に作成し、そちらに最新のデータをwriterowを利用して書き込んでいくか、writerowを利用せずに、writeやprintなどを利用して追記していく。
guest

回答1

0

自己解決

・打刻者名がある出勤打刻のテンポラリファイルがなければ作成して日付と出勤打刻時間を記入したテンポラリファイルを作成(以下①とする)
・退勤打刻時にif文で①があれば、Pandasを用いて必要なデータを抽出する
・with open(csvファイル名, 'a')
・writerowで日付・出勤時間・退勤時間・残業時間を書き込み
・①を削除

この手順に従って作成したらできました。
ありがとうございました。

投稿2019/09/10 15:59

yusuke.y

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問