【第23回PYTHON講座】CSVファイル形式の予定表を作ろう

PYTHON

こんにちは。
今回はCSVファイル形式の簡単な予定表を作ってみようと思います。

CSVファイルは、カンマ『,』で区切ったデータ形式のファイルをいいます。

例えば、メモ帳で下記の通り入力します。そして、ファイル名を「test」、拡張子を『CSV』で保存します。

名前, 年齢 
田中太郎, 33 
佐藤花子, 40

保存したファイルをエクセルなどの表計算ソフトで開くと、カンマを区切りと見なし、自動的にセルに振り分けられ表示されます。

CSVを表計算ソフトで開く

では、CSVファイル形式のスケジュール表を作るプログラムの作成を始めましょう。

プログラムの内容
年月を入力し、その年月の予定表を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()

予定表

最後に

いかがだったでしょうか。

ファイルの書き込み、時間の扱いについて少し理解できたでしょうか。

これをアレンジしていけばカレンダーも作れるかもしれません。色々と応用してみて下さい。

コメント

タイトルとURLをコピーしました