こんにちは。
今回はCSVファイル形式の簡単な予定表を作ってみようと思います。
CSVファイルは、カンマ『,』で区切ったデータ形式のファイルをいいます。
例えば、メモ帳で下記の通り入力します。そして、ファイル名を「test」、拡張子を『CSV』で保存します。
名前, 年齢
田中太郎, 33
佐藤花子, 40
保存したファイルをエクセルなどの表計算ソフトで開くと、カンマを区切りと見なし、自動的にセルに振り分けられ表示されます。
では、CSVファイル形式のスケジュール表を作るプログラムの作成を始めましょう。
今回のプログラムで、ファイルの書き込み、時間の扱いについて学習しましょう。
ファイルに文字を入力する方法を覚えよう!
予定表を作成する前に、ファイルに文字を入力する方法をマスターしましょう。
f= open('C:/Labo/python/csv-simpleschedule/schedule.csv', 'w')
f.write(f"日付, 予定\n")
f.write(f"2020年7月1日, \n")
f.close()
1行目:スケジュール表のcsvファイルを開ける関数です。
絶対パスでファイルを指定しています。絶対パスだと長くなりますが、ファイルの場所を明確に示す利点があります。
『w』にすることで、ファイルを書き込みモード(write)で開きます。
『w』は、ファイルが存在しない場合、ファイルを新規作成します。また、ファイルが存在している場合、ファイル内をリセットして新規に書き込みを行います。
3行目:『write』はファイルに1文ずつ書き込みます。『\n』は改行です。
6行目:ファイルを開いた際は必ず『close』することを忘れないで下さい。重要です!!
ファイルの書き込みの仕方が分かりましたね。
ファイルの作成手順を覚えよう!
次に、ファイルを作成する手順をマスターしましょう。
コマンドプロンプトで、入力された年月からファイル名を作り、ファイルを作成します。
foldername = "C:/Labo/python/csv-simpleschedule/" inputdata = input("Please input year and month(eg:2020/1) >> ") year, month = (x for x in inputdata.split('/')) filename = foldername + year + month + ".csv" f= open(filename, 'w') f.write(f"日付, 予定\n") f.write(f"2020年7月1日, \n") f.close()
1行目:ファイルを作成する先のフォルダを指定します。
3行目:作成したい予定表の年月を入力します。入力されたデータは『inputdata』に格納されます。
“Please input year and month(eg:2020/1) >> “のようにコメントを書くと、どのように入力すればいいか分かりやすくなります。
4行目:入力された年月はスラッシュマーク『/』で年と月が別けています。『(x for x in inputdata.split(‘/’))』を実行して、入力文字を『/』で別けて、『year』と『month』にそれぞれ格納します。
5行目:絶対パスでファイル名を定義します。拡張子”.csv”は忘れないで下さい。
『inputdata.replace(‘/’, ”)』は、”2020/07”と入力された場合、”202007.csv”というファイル名にする為に、『/』を削除する関数になります。
ファイルが作成されました。
ファイルに1か月分の日付を入力していく
ここからが本番です。
入力された年月でその月の予定表を作成します。
2020/07と入力されたら、1日から下記のように入力していきます。
そこで、下記の事項を考えなければなりません。
- 日付を1か月分入力するにはどうするのか?
- 曜日はどのようにして出力するのか?
日付を記入する
日付に関しては、日時を扱うライブラリ『datetime』を使います。
import datetime
最初の月日『startdate』を設定するには、『datetime.date(年、月、日)』の関数を使用します。月の最初の日は”1日”なので、1を入力します。
startdate = datetime.date(int(year), int(month), 1) print(startdate)
>>出力結果 2020-07-01
この『startdate』以降の日を、月の最後の日まで、csvに追記していきますが、次の日を求める為には『startdate』に+1をすればいいわけではありません。
日付の加算は、次のように、『datetime.timedelta(days=1)』を使います。『startdate』に加算すると、『startdate』の翌日を得る事ができます。
startdate += datetime.timedelta(days=1)
上記のコードを利用し、forループを使って、月の日付を記入しています。
月の変わり目を知る
forループで日付を入力していきますが、月の変わり目でforループを関数を停止しなければなりません。
では、どうするか考えてみましょう。
『startdate』は、最初2020-07-01ですが、加算されつづけ2020-08-01になる時が来ます。
08という月を見る為に、『startdate.strftime(‘%m’)』を使用します。『%m』はmonth(=月)という意味です。
print(startdate.strftime('%m')) 2020/07と入力した場合の出力結果>>07
日付を記入していくループ関数の中で、月が変わったら、ループ関数を『break』すればいいのです。下記の通りになります。
startdate = datetime.date(int(year), int(month), 1) for i in range(40): if (startdate.strftime('%m') != month): break else: f.write(f"{startdate.strftime('%Y')}年{startdate.strftime('%m')}月{startdate.strftime('%d')}日,\n") startdate += datetime.timedelta(days=1)
これで、月の最後まで日付を入力することが出来ました。
曜日を出す
曜日は『startdate.strftime(‘%w’)』を使用します。戻り値は数字で返ってきます。0~6で日曜日から土曜日です。
『startdate.strftime(‘%A’)』とすると、英語でSUNDAYと返ってきますが、日本語にしたいので、上記を使用します。
nihongo = ['日', '月', '火', '水', '木', '金', '土'] for i in range(40): if (startdate.strftime('%m') != month): break else: f.write(f"{startdate.strftime('%Y')}年{startdate.strftime('%m')}月{startdate.strftime('%d')}日({nihongo[int(startdate.strftime('%w'))]}),\n") startdate += datetime.timedelta(days=1)
forループに曜日を加える関数を付け加えます。
1行目:日本語の曜日のリストを作っておきます。strftime(‘%w’)で返ってくる値と同じ並びで曜日を並べます。日曜日にならstrftime(‘%w’)は0を戻すので、リストの最初は日にするという具合です。
これで完了です!!
では全部のコードを合わせてみましょう。
プログラム全コード
import datetime nihongo = ['日', '月', '火', '水', '木', '金', '土'] foldername = "C:/Labo/python/csv-simpleschedule/" inputdata = input("Please input year and month(eg:2020/01) >> ") year, month = (x for x in inputdata.split('/')) filename = foldername + year + month + ".csv" f= open(filename, 'w') f.write(f"日付, 予定\n") startdate = datetime.date(int(year), int(month), 1) for i in range(40): if (startdate.strftime('%m') != month): break else: f.write(f"{startdate.strftime('%Y')}年{startdate.strftime('%m')}月{startdate.strftime('%d')}日({nihongo[int(startdate.strftime('%w'))]}),\n") startdate += datetime.timedelta(days=1) f.close()
最後に
いかがだったでしょうか。
ファイルの書き込み、時間の扱いについて少し理解できたでしょうか。
これをアレンジしていけばカレンダーも作れるかもしれません。色々と応用してみて下さい。
コメント