コース一覧
    Pythonファイル・エラー・制作
    つくる:保存機能

    Pythonファイル・エラー・制作

    ファイル操作と例外処理を学び、入出力を含む小さなPython制作を安全に進められるようにします。

    1
    ファイルとエラー処理
    01. ファイルを読み込む15分
    02. ファイルに書き込む15分
    03. withで安全に扱う15分
    04. CSV形式で保存15分
    05. try-exceptで備える15分
    06. 例外の種類15分
    07. つくる:保存機能15分
    08. 第8章クイズ10分
    2
    総合制作
    01. 全機能を統合しよう15分
    02. 月間レポート機能15分
    03. 自由拡張15分
    04. 完成と次のステップ10分

    つくる:保存機能

    保存と読み戻しは、必ず対で作る

    この章では、読み込み、書き込み、with、CSV、例外の受け止めを扱ってきました。最後にそれらを 1 本につなぎます。

    作るのは save_and_load(path, records) です。渡された辞書のリストを保存し、そのファイルを読み戻して、元と同じ形の辞書のリスト を返します。入れたものと同じものが出てくるだけの地味な関数ですが、これが成り立つということは、アプリを閉じても記録が失われないということです。

    手を付ける順番は次のとおりです。まず書き出す側から作ります。1 件を "品名,金額,カテゴリ" の行にして、行を改行でつなぎ、with で書き出します。ここまでは前の 2 回でやったことの組み合わせです。

    次に読み戻す側です。with で読んで splitlines で行に分け、1 行ずつ split(",") で 3 つに分けて、辞書に組み直します。3 つに分かれた値は、タプルアンパックでそのまま 3 つの変数に受けられます。

    片方だけ先に完成させると、書いた形式が読めないことに後から気づいて作り直しになります。1 件だけの記録で書いて読んで、往復できることを確かめてから件数を増やしてください。

    ファイルから読んだ値は、すべて文字列

    いちばん引っかかるのがここです。

    Python

    name, price, category = "りんご,120,食費".split(",")
    print(price + 100)

    TypeError になります。price に入っているのは "120" という文字列で、数値ではありません。ファイルには文字しか入っていないので、読み戻した時点ではすべて str です。

    辞書に入れる前に int を通します。忘れると、合計を計算するところで "120" + "80" が "12080" になる、という第 2 章で見た事故が起きます。見た目は似ているのでテストが落ちるまで気づきません。

    書くときに str、読むときに int。この対称性が崩れると、型がじわじわ混ざって原因の分かりにくいバグになります。

    0 件のときが、いちばん壊れやすい

    記録が 0 件のときを先に確かめます。書き出す文字列は空になり、中身が空のファイルができます。読み戻すと read は "" を返します。

    Python

    print("".splitlines())
    print("".split("\n"))

    [] と [''] です。splitlines なら for が 1 度も回らず、場合分けを書かずに空リストが返ります。split("\n") を使っていた場合は空文字が 1 件あることになり、それをカンマで 3 つに分けようとして ValueError で落ちます。

    with を 1 つにまとめようとして詰まるのも定番です。書きモードで開いたファイルからは読めないので、書きと読みで 2 回に分けます。

    やってみよう

    関数 save_and_load(path, records) を実装してください。records を "品名,金額,カテゴリ" の行にして path に保存し、そのファイルを読み戻して辞書のリストに復元して返します。

    キーは name、price、category の 3 つで、保存の順もこのとおりです。金額は保存時に文字列、復元時に int を通します。records が空リストのときは空リスト [] が返れば正解です。ファイルを開くときは with を使ってください。

    要件

    1. 関数名は save_and_load で、引数は path と records の 2 つ
    2. 1 件を "品名,金額,カテゴリ" の行にし、改行でつないで path に書き出す
    3. ファイルを開くときは with を使う
    4. 書き出したファイルを読み戻し、split でカンマごとに分けて辞書に復元する
    5. 金額は int に戻し、文字列のままにしない
    6. records が空リストのときは空リストを返す

    ヒント

    書き出しは str(record["price"]) で金額を文字列にしてから連結します

    書きモードのファイルからは読めないので、with を 2 回に分けます

    読み戻しは text.splitlines() で行に分け、line.split(",") で 3 つに分けます

    name, price, category = line.split(",") とタプルアンパックで受け取れます

    辞書に入れるときに int(price) を通すのを忘れないでください

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/08/05·更新 2026/08/26

    関連レッスン

    • 第8章クイズ

      ファイルのモード、with、CSV の型の往復、except の捕捉範囲を5問で確認する

    • 全機能を統合しよう

      各章で作った部品を1本にまとめ、コマンド列を順に処理する run_kakeibo を作る

    • 例外の種類

      FileNotFoundError を受け止めて、保存ファイルが無い初回起動でも落ちないようにする

    • try-exceptで備える

      try と except で ValueError を受け止め、変換に失敗しても止まらない関数を書く

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • リスト順序付きで複数の値を扱うデータ構造
    • 関数処理に名前を付けて再利用できる単位
    • タプル順序付きで変更不可のシーケンス
    • 変数データに名前をつけて参照する仕組み
    • テストバグを見つける工程
    • 引数位置引数=順番で渡す。
    main.py
    エディタを読み込んでいます

    メモ

    つくる:保存機能

    ⌘S で保存