プログラミング

Python超入門⑦ エラー処理とファイル保存を覚えよう

try、except、ValueError、with、openを使い、入力エラーへの対応とテキストファイルの読み書きを学びます。

数字を入れるつもりが、うっかり文字を入力。すると赤いエラーが出て、プログラムが止まってしまった……。

入力する人が間違えることはありますよね。そこで今回は、想定したエラーに対応して、もう一度入力してもらえるようにします。後半では、プログラムを閉じてもデータを残せるファイル保存へ進みます。

準備:今回は練習専用のフォルダで動かす

Python 3で、入力、if文、繰り返しが使えることを前提にします。

ファイルの例は、自分のパソコンに作った練習専用フォルダで実行してください。ブラウザの学習環境では、ファイル操作が制限されたり、終了すると消えたりすることがあります。

後半の書き込み例は、同名のファイルがあると内容を上書きします。大事なファイルのある場所では試さないでください。 ここは先に確認しておきましょう。

1. エラーの種類を見て、対応を決める

text = input("点数: ")
score = int(text)
print(score)

80 と入力すると80が表示されます。一方、abc と入力すると int() で整数へ変換できず、ValueError になります。

例外(れいがい)は、実行中に通常の処理を続けられなくなったことを知らせる仕組みです。ValueErrorも、その種類の1つです。

入力・状況 起きること
80 整数へ変換できる
abc 整数へ変換できずValueError
3.5 整数の文字表記ではないためValueError
空のままEnter 空文字列を変換できずValueError

エラーをなくすことだけが目的ではありません。「どんな失敗を予想し、どう案内するか」を考えることが大切です。Python公式のエラーと例外の説明

2. tryとexceptで、失敗した場合の道を作る

try:
    score = int(input("点数: "))
    print(f"{score}点です")
except ValueError:
    print("整数で入力してください")

try は、例外が起きるかもしれない処理を置く場所です。except ValueError は、その範囲でValueErrorが起きた場合の処理です。

動きを2つに分けます。

入力が80だった場合

  1. inputで "80" を受け取る
  2. intで80へ変換できる
  3. 「80点です」を表示する
  4. exceptの中は動かさず、その先へ進む

入力がabcだった場合

  1. inputで "abc" を受け取る
  2. intでValueErrorが起きる
  3. tryの残りの表示を飛ばす
  4. 対応するexceptへ進み、「整数で入力してください」を表示する

失敗した行の次から自動的に再開するわけではありません。また、このコードは1回案内して終わります。「もう一度入力してほしい」なら、繰り返しを組み合わせます。

3. 正しく入力できるまで、もう一度聞く

while True:
    try:
        score = int(input("0から100の点数: "))
    except ValueError:
        print("整数で入力してください")
        continue

    if 0 <= score <= 100:
        break

    print("0から100の範囲で入力してください")

print(f"{score}点を受け取りました")

例えば abc、120、80 の順に入力すると、こうなります。

0から100の点数: abc
整数で入力してください
0から100の点数: 120
0から100の範囲で入力してください
0から100の点数: 80
80点を受け取りました

ここには、別々の2つの確認があります。

  • 変換できるか:整数にできなければexceptで案内し、continueで次の入力へ
  • 範囲が正しいか:整数でも0から100の外なら、案内して繰り返す

break に届くのは、両方を満たしたときだけです。ターミナルで入力を中止したい場合は、通常 Ctrl + C で終了できます。

すべてのエラーを隠すのは避ける

except: だけで何でも受け取ったり、失敗を何も表示せず無視したりすると、本当の不具合を見つけにくくなります。

この例では、予想しているのは整数への変換失敗なので ValueError を指定しています。予想外のエラーが出たら、エラー表示の読み方を使って原因を調べましょう。

4. ファイルは、プログラムの外へデータを残す場所

変数の値は、プログラムを終了すると次回の実行へ自動では引き継がれません。残しておきたい情報を、ファイルへ書き出してみます。

どこへ保存されるかを確認する

次の例は、今の作業フォルダを表示します。

from pathlib import Path

print(Path.cwd())

pathlib は、ファイルやフォルダの場所を扱うPython標準の道具です。from ... import ... は、使う道具を読み込む書き方。Path.cwd() は、今の作業フォルダを調べます。

open("memo.txt", ...) のようにファイル名だけを指定した場合、通常はこのフォルダが基準です。Pythonファイルが置いてある場所と、必ず同じとは限りません。 「保存したはずなのに見つからない」ときは、まずここを確かめてください。

5. withとopenで、文字を書き込む

次の例は、作業フォルダのmemo.txtを上書きします。練習用の場所で、同名の大事なファイルがないことを確認してください。

with open("memo.txt", "w", encoding="utf-8") as file:
    file.write("今日はif文を勉強しました\n")

print("保存しました")
保存しました

保存されたmemo.txtの中身は、次の1行です。

今日はif文を勉強しました
部分 役割
open() ファイルを開く
"memo.txt" 開くファイル名
"w" 書き込み。既存内容は消してから書く
encoding="utf-8" 文字を保存するときの形式を指定する
as file 開いたファイルをfileという名前で扱う
file.write(...) 文字列を書き込む
\n 改行を表す

文字コードは、文字とデータの対応の決め方です。日本語を書いたファイルを読み返すときもUTF-8にそろえると、形式の食い違いを避けやすくなります。

with を使うと、まとまりを抜ける際にファイルが閉じられます。ただし、誤った上書きや保存先の指定まで防ぐ機能ではありません。Python公式のファイル読み書き

6. 読む・追記する・新規作成する

保存した文字を読む

先ほどの書き込みを実行した後で試します。

with open("memo.txt", "r", encoding="utf-8") as file:
    text = file.read()

print(text, end="")

"r" は読み込みです。read() で中身を文字列として受け取れます。ファイルには改行も入っているので、ここでは end="" を指定し、printがさらに改行を追加しないようにしています。

モードで動きが変わる

モード 目的 同名ファイルがある場合
"r" 読み込み 中身を読む。なければエラー
"w" 書き込み 既存内容を消す
"a" 末尾へ追記 既存内容を残して追加する
"x" 新しいファイルを作る 既存ファイルがあるとエラー

追記なら、次のように書けます。

with open("memo.txt", "a", encoding="utf-8") as file:
    file.write("次は繰り返しも練習します\n")

実行するたびに1行ずつ増えます。"w" と "a" は1文字違いですが、元の内容が残るかどうかが大きく変わるので注意してください。

見つからないファイルを読む場合

try:
    with open("memo.txt", "r", encoding="utf-8") as file:
        text = file.read()
except FileNotFoundError:
    print("memo.txtが見つかりません。保存先を確認してください")
else:
    print(text, end="")

else は、tryで例外が起きなかった場合に動きます。FileNotFoundErrorは「指定したファイルが見つからない」という種類です。権限不足など、別の理由のエラーまで処理しているわけではありません。

7. 練習:ニックネームを保存して読み返そう

名前をinputで受け取り、profile.txtへ保存します。その後、同じファイルから読み取って表示してください。

この練習ではニックネームを使い、個人情報は入れないようにしましょう。解答の "w" はprofile.txtを上書きするので、練習専用フォルダで実行してください。

模範解答

name = input("ニックネーム: ")

with open("profile.txt", "w", encoding="utf-8") as file:
    file.write(name)

with open("profile.txt", "r", encoding="utf-8") as file:
    saved_name = file.read()

print(f"保存した名前: {saved_name}")
ニックネーム: あおい
保存した名前: あおい

解説:変数を出しただけではない

  1. inputから名前を受け取る
  2. 書き込み用にファイルを開く
  3. 名前を書き込み、最初のwithを抜けて閉じる
  4. 読み込み用に同じファイルを開き直す
  5. 内容を saved_name に受け取り、表示する

print(name) とするだけでは、ファイルに保存できたか確かめられません。別の読み込みで値を取得することで、書いた内容を確かめています。

コードを書き終えたら、練習フォルダにprofile.txtがあるか、その中身が入力した名前かも確認してみてください。保存先と内容が一致していれば成功です。

まとめ:失敗の種類と、保存先を意識しよう

今回は、予想できる入力ミスへの対応と、プログラムの外へ文字を残す方法を学びました。

エラーを一括で隠さず、種類に合わせて案内する。ファイルを開く前に、保存先とモードを確認する。この2つを習慣にすると、データを扱うコードがぐっと読みやすくなります。

前の記事:Python超入門⑥ リストと辞書

次の記事:Python超入門⑧ クイズゲーム

← 記事一覧へ戻る