ファイルを読み込む
終了した瞬間に、記録が全部消える
ここまでのおこづかい帳は、閉じると記録がすべて消えていました。変数もリストも辞書も、メモリの上にしかないからです。次に開いたときも同じ記録を見るには、内容を ファイル に残すしかありません。
読み込みは open から始めます。第 1 引数がファイルのパス、第 2 引数がモードで、読み込みは "r" です。
Python
with open("kakeibo.txt", "r", encoding="utf-8") as f:
text = f.read()with open(...) as f と書き、そのブロックの中でファイルを使います。f はファイルを操作するための取っ手で、read を呼ぶと中身が丸ごと返ってきます。ブロックを抜けるとファイルは自動で閉じられます。
encoding="utf-8" は文字コードの指定です。日本語を含むファイルでこれを付けないと、環境によって文字化けしたりエラーになったりします。付ける癖を付けておくと事故が減ります。
返ってきたのは、1 本の長い文字列だった
read が返すのは行のリストではありません。改行 \n を含んだ 1 本の文字列です。3 行書いてあれば、改行が 2 つ入った 1 つの str が返ります。
行ごとに扱いたいなら、こちらで分けます。使うのは splitlines です。
Python
text = "りんご,120,食費\nみかん,80,食費"
print(text.splitlines())['りんご,120,食費', 'みかん,80,食費'] になります。
split("\n") でもほぼ同じことができますが、末尾の扱いが違います。
Python
print("パン\n牛乳\n".split("\n"))
print("パン\n牛乳\n".splitlines())['パン', '牛乳', ''] と ['パン', '牛乳'] です。ファイルの最後に改行が 1 つ入っているのはよくあることで、split だと空文字が 1 つ増えます。この空文字はその場ではエラーにならず、集計の段になって「品名が空の支出」として表面化します。取り込む入口で形をそろえておくのが一番安上がりです。
中身が空文字のときは、splitlines の結果も空リスト [] です。「まだ 1 件も記録がない」状態が、場合分けなしで表せます。
やってみよう
関数 read_lines(path, text) を実装してください。まず path に text を書き出し、そのうえで同じファイルを読み込み、splitlines で行のリストにして返します。
学習環境にはあらかじめファイルを置けないため、中身も引数で受け取って自分で用意する形にしています。書き込みも同じ with open(...) の形で、モードの文字を "w" にして f.write(text) を呼びます。open には読み書きとも encoding="utf-8" を指定してください。text が空文字のときは空リスト [] が返れば正解です。
print で確かめて満足するのもよくある落とし穴です。採点は戻り値だけを見るので、必ず return で返してください。
要件
- 関数名は read_lines で、引数は path と text の 2 つ
- 先に path を書き込みモードで開き、text をそのまま書き出す
- 同じ path を読み込みモードで開き、read で中身を取得する
- splitlines で行のリストにして return する
- open には encoding="utf-8" を指定する