ファイルに書き込む
write は改行を付けてくれない
読めるようになったので、今度は書きます。おこづかい帳で言えば、閉じるときに記録を残す部分です。書き込みも open から始まり、変わるのはモードの文字だけです。読みが "r"、書きが "w" です。
Python
with open("kakeibo.txt", "w", encoding="utf-8") as f:
f.write("りんご,120,食費")write はかっこの中の文字列をそのまま書き出します。print と似ていますが、決定的な違いが 1 つあります。print は行の終わりに自動で改行を付けますが、write は付けません。
そのため write を 2 回呼んでも 2 行にはならず、りんご,120,食費みかん,80,食費 と横につながります。改行が要るなら自分で \n を書きます。
行のリストを 1 本の文字列にまとめるのは、辞書の走査で使った join の仕事です。区切りを "\n" にすれば要素と要素のあいだにだけ改行が入り、末尾には付きません。for で 1 行ずつ書くと、最後の行だけ改行を付けないという面倒な場合分けが要ります。join のほうが素直です。
write が受け取れるのは文字列だけです。リストを渡せば TypeError になり、f.write(120) のように数値を渡しても TypeError です。金額を書くときは str(120) で文字列にしてからにします。
"w" は、開いた瞬間に中身を消す
"w" は上書きのモードです。書く前から消えます。開いて何も書かずに閉じただけでも、元の記録は空になります。読むつもりで "r" と "w" を打ち間違えると起きる事故です。
大事なファイルのパスを渡す前に、一度 /tmp の適当な名前で試すのが安全です。
「書けたつもり」がいちばん危ない
書き込みの怖いところは、失敗しても静かなことです。パスを打ち間違えても、意図しない場所にファイルができるだけで、エラーは出ません。
そこでこの演習では、書いた直後に同じパスを読み戻し、その内容を戻り値にします。読み戻せたということは、確かに書けたということです。学習環境の都合でこの形にしていますが、実際の開発でも保存処理の確認は同じ考え方でやります。
やってみよう
関数 write_records(path, lines) を実装してください。lines は文字列のリストです。改行でつないで 1 本の文字列にしてから path に書き出し、同じファイルを読み戻して、その内容の文字列を return します。
open には書きも読みも encoding="utf-8" を指定します。lines が空リストのときは空文字 "" が返れば正解です。末尾に余計な改行を足さないよう気をつけてください。
要件
- 関数名は write_records で、引数は path と lines の 2 つ
- lines を "\n".join で 1 本の文字列にしてから書き出す
- path を書き込みモードで開き、write で書き出して close する
- 同じ path を読み込みモードで開き、read の結果を return する
- open には encoding="utf-8" を指定する