ファイルを読んで、間違いに負けない
Python では、テキストファイルを開いて行ごとに読み、結果を別のファイルに書けます。読めない行があってもプログラムが止まらないように、try と except でエラーを受け止められます。
点数が並んだファイルに、打ち間違いの行が1つ混ざっていると、集計は止まってしまいます。止まらずに数える方法を学びます。
このレッスンのゴール
メモ
ファイルの行を読み、読めない行があっても止まらずに集計することができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| open | ファイルを開く関数 | open("scores.txt") |
| with | 使い終わったファイルを、自動で閉じる書き方 | |
| strip | 文字列の前後の空白と改行を取り除く | |
| 例外 | プログラムの実行中に起きるエラー | ValueError |
| try | エラーが起きるかもしれない処理を囲む | |
| except | エラーが起きたときの処理を書く |
学生が入力するセルは、このプレビューでは空白です。
open と with でファイルを読む
with open("scores.txt") as f: と書くと、ファイルが開き、下げた行の間だけ使えます。終わると自動で閉じます。
for line in f: で、1行ずつ読めます。各行の終わりには改行がついているので、line.strip() で取り除きます。
点数のファイルを作る
printf '80\n65\nabc\n90\n' > scores.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
中身を確かめる
cat scores.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
読むプログラムを書き出す
printf 'with open("scores.txt") as f:\n for line in f:\n print(line.strip())\n' > read.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
実行して、同じ4行が出るか見る
python3 read.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
strip と split で1行を分ける
「Aki,80」のように、カンマで区切った行は、line.strip().split(",") で2つに分けられます。結果は ["Aki", "80"] のリストです。
点数の "80" は文字列なので、計算するには int() で整数に直します。
1行を名前と点数に分ける
# 「名前,点数」の形の行を、2つに分けます。
lines = ["Aki,80\n", "Ben,65\n", "Chi,90\n"]
for line in lines:
parts = line.strip().split(",")
name = parts[0]
score = int(parts[1])
print(name, "さん:", score + 5, "点(5点加点)")
# 加点を 10 点に変えて、もう一度実行しましょう。
"w" で開くとファイルに書ける
open("out.txt", "w") で開くと、ファイルに書き込めます。f.write("hello\n") で1行書きます。
"w" で開くと、すでにあるファイルの中身は消えて、新しく作り直されます。大事なファイルの名前は、使わないでください。
ファイルに1行書く
python3 -c "with open('out.txt', 'w') as f: f.write('hello\n')"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
書いた中身を確かめる
cat out.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
try と except でエラーを受け止める
int("abc") のように、直せない値を直そうとすると、例外が起きて、プログラムが止まります。
try: の下に危ない処理を書き、except ValueError: の下に、エラーのときの処理を書きます。エラーが起きても、プログラムは次へ進みます。
わざとエラーを起こす
python3 -c "print(int('abc'))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
エラーを受け止めるプログラムを書く
printf 'for text in ["80", "abc", "90"]:\n try:\n print(int(text) + 1)\n except ValueError:\n print("bad:", text)\n' > try.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
実行して、止まらないことを確かめる
python3 try.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
「try で囲んで、except だけ書けば、どんなエラーも消せる」と考える人がいます。名前をつけずに受け止めると、自分の書き間違いまで隠れてしまいます。起こりそうなエラーの名前を、except ValueError: のように指定しましょう。