台帳を保存・復元せよ
師範 / 目安 35分
松田さんが青い顔で事務局に駆け込んできました。「昨日、商店街が停電してな。パソコンの電源がぱちんと落ちて…あのとき台帳を打ち込んどったら、全部消えとったんじゃないか」。手書きの帳面には無かった不安です。「頼む、ファイルに残して、次に開いたときちゃんと読み込めるようにしてくれんかね」
ここからが師範の段です。プログラムは終われば消えます。消えないのはファイルに書いたものだけです。今回は、会員データをファイルに書き出し、そのファイルを読み直して元の形に戻すところまでを、1つの関数の中で通します。書けただけでは半分で、読み直して元通りになって初めて保存できたと言えます。
完成条件
save_and_load(members) という関数を定義してください。
membersは{"name": "田中はじめ", "points": 1200}の形の辞書を並べたリストです- 中身を
ledger.txtというファイルに書き出します。書き込みは上書きモードで開いてください - 1行に1会員、
名前,ポイントの形にします - 書き終えたら同じファイルを開き直して読み込み、
membersと同じ形の辞書のリストに戻して返します - ポイントはファイルから読むと文字列になります。整数に戻してください
- 空行は読み飛ばします。ひな形に用意済みです
- 名前にはカンマや改行を含まないものとします
返す値は、渡したリストと同じ並び・同じ中身でなければいけません。
ファイルの行とデータを行き来する
別の題材として、本の題名とページ数を保存して読みます。
Python
book = {"title": "星の本", "pages": 80}
with open("books.txt", "w", encoding="utf-8") as f:
f.write(f"{book['title']},{book['pages']}\n")
with open("books.txt", encoding="utf-8") as f:
for line in f:
title, pages = line.strip().split(",")
pages = int(pages)
print(title, pages)open() でファイルを開きます。"w" は前の内容を消して書き直すモード、省略時は読むモードです。encoding="utf-8" は日本語を保存するときの文字の表し方を指定します。with の中で使い、字下げの外へ出ると自動で閉じるので、書き終えてから読む順番になります。write() は文字列を書き、print と違って改行を自動で足さないので \n を付けます。
for line in f はファイルの各行を順に取り出します。"星の本,80".split(",") は ["星の本", "80"] になります。title, pages = ... は2つの値を左側の2つの変数に順に入れる書き方です。数字も文字列なので int で戻します。continue は繰り返しの残りを飛ばし、次の行へ進みます。開閉、走査、空行の処理はひな形にあります。自分で考えるのは、辞書と1行の間の変換です。
進め方
ひな形の「ここに書く」を完成させてください。pass は何もしない仮の行です。その行を自分の処理に置き換えます。準備済みのコードはそのまま使えます。手が止まったら、①方針、②使う構文、③部分解の順にヒントを開けます。
数分考えて手が止まったら、①から確認してください。本文の別の題材の例を動かし、今回の値に置き換えて考えましょう。
追記モードでは呼ぶたびに行が積み上がってしまいます。ひな形の上書きモードなら、前の内容を消して毎回書き直せます。モードの選択は準備済みなので、行への変換に集中しましょう。
要件
- save_and_load(members) を完成させる。members は
{"name": ..., "points": ...}の辞書のリスト - ledger.txt を上書きモードで開き、1行に1会員を「名前,ポイント」の形で書く
- 書き終えたら同じファイルを開き直して読み込む
- 読んだ行を分解し、ポイントを int に戻して辞書に組み立てる
- 空行は読み飛ばす
- 復元したリストを return する。並びも中身も元と同じにする
- 名前にはカンマや改行を含まない。開閉と空行の読み飛ばしは準備済みなので、2か所の変換だけを完成させること
ヒント
前のヒントを開くと次が開きます。開かずに解けると未開封クリアです