コース一覧
    Pythonファイル・エラー・制作
    withで安全に扱う

    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で安全に扱う

    with と close 忘れ

    書いたはずなのに、ファイルが空だった

    with を使わずに書くと、こうなります。

    Python

    f = open("kakeibo.txt", "w", encoding="utf-8")
    f.write("りんご,120,食費")

    このまま先へ進むと、ファイルを開いてみても中身が空のことがあります。write で渡した文字列は、いったん手前にためられてからまとめてファイルへ送られるからです。送り切るのは閉じるときです。

    閉じるには f.close() を呼びます。ただ、この 1 行は書き忘れます。しかも忘れても、その場では何のエラーも出ません。

    with を使うと、閉じる仕事を Python 側が引き受けます。

    Python

    with open("kakeibo.txt", "w", encoding="utf-8") as f:
        f.write("りんご,120,食費")

    ブロックを抜けた時点で閉じられ、中身は確実にファイルへ届いています。close の行は書きません。書いても動きますが、意味のない 1 行になります。

    途中で例外が出ると、close にたどり着けない

    with の値打ちは、書き忘れを防ぐことだけではありません。

    f.close() を律儀に書いたとしても、その手前の行で例外が起きれば close は実行されないまま関数を抜けます。ファイルは開きっぱなしになり、書いた内容も届きません。しかも症状はあとから出るので、原因にたどり着くのに時間がかかります。

    with はブロックを抜けるときに必ず閉じます。途中で例外が起きた場合も、閉じてから例外を投げ直します。うまくいった道と失敗した道の、どちらを通っても片付けは済んでいます。

    ブロックを抜けたあとの f は使えない

    with のブロックは、インデントされている範囲です。ここがそのままファイルの寿命になります。

    Python

    with open("kakeibo.txt", "r", encoding="utf-8") as f:
        text = f.read()
    
    lines = text.splitlines()

    read はブロックの中、splitlines は外です。ブロックを抜けたあとに f.read() を呼ぶと ValueError になります。閉じたファイルは読めません。

    一方、text に入れた文字列はそのまま使えます。閉じられるのはファイルであって、変数の中身ではありません。ファイルとのやり取りだけを中に置き、計算や整形は外に出す。この切り分けがそのまま読みやすさになります。

    やってみよう

    関数 save_text(path, text) を実装してください。with を使って path に text を書き出し、そのあともう一度 with で同じファイルを読み込み、読み戻した文字列を return します。

    書きと読みで with は 2 回に分けます。書きモードで開いたファイルからは読めないので、1 つにまとめることはできません。open には encoding="utf-8" を指定し、close は書かずに with に任せてください。text が空文字のときは空文字が返れば正解です。

    要件

    1. 関数名は save_text で、引数は path と text の 2 つ
    2. 書き込みと読み込みの両方で with 文を使う
    3. close は書かず、with に閉じる処理を任せる
    4. 読み戻した文字列を return する
    5. open には encoding="utf-8" を指定する

    ヒント

    with open(path, "w", encoding="utf-8") as f: と書き、次の行をインデントします

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

    read の結果を変数に入れ、ブロックの外で return します

    with の行末にはコロンが必要です

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

    関連レッスン

    • CSV形式で保存

      join と split で辞書のリストを「品名,金額,カテゴリ」の行に変換する

    • try-exceptで備える

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

    • 例外の種類

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

    • つくる:保存機能

      第8章の総仕上げ。記録をファイルに保存し、読み戻して辞書のリストに復元する

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

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

    • ロック「他の人触らないでね」と DB に予約する
    • 関数処理に名前を付けて再利用できる単位
    • インデントPythonはインデント(通常スペース4つ)でコードブロックを定義する。
    • 変数データに名前をつけて参照する仕組み
    • 引数位置引数=順番で渡す。
    • 処理計算や代入を表す長方形
    main.py
    エディタを読み込んでいます

    メモ

    withで安全に扱う

    ⌘S で保存