動画の解説を参照
以前にも見たように、inputを使えばキーボードからユーザーに入力させることができます。
ただし、入力された値は文字列型なので、例えば整数の足し算を行わせたい場合はそれを整数に変換する必要があります。
ユーザーが常に「行儀のよい値」を入れていれば問題ありませんが、整数に変換できないものを入力してしまうとエラーになります。
エラーメッセージの「Value Error」は、変換できない型に変換しようとしたことを表します。
エラーでコードの実行が止まってしまうのは困ります。
try~except構文を使うと、エラーが発生したときに別の処理を行わせることができます。
まず try の下の3行の命令を実行し、「ValueError」が発生したらexceptの下に飛びます。
こうすることで止まりにくい、堅牢なコーディングができます。
これを応用すれば、整数とそうでないものが混在しているリストを「行儀のよい」リストにすることもできます。
整数に変換できるものを入力するまで再入力させるように概要のコードを改良し、動作を確認するコードを記述してください。
※ x, yのどちらも最初は整数でないもの、次に整数に変換できるものを入力してください。
(例)
動画の解説を参照
open文を使うと、ファイルを開いて文字の書き出し・読み込みができます。
modeに入れる値によって、以下の表のようにできることが異なります。
| 値 |
由来 |
ファイルがある場合の動作 |
ファイルがない場合の動作 |
| 'w' |
write |
書き出し専用(上書き)で開く |
ファイルを作成し、書き出し専用で開く |
| 'x' |
exclusive |
FileExistsError |
ファイルを作成し、書き出し専用で開く |
| 'a' |
append |
書き出し専用(追記)で開く |
ファイルを作成し、書き出し専用で開く |
| 'r' |
read |
読み取り専用で開く |
FileNotFoundError |
以下のようなコードを実行すると、コンソールには何も表示されませんが、「write_test.txt」というファイルが作られます。
「mode='w'」は上書きモードで開くことを意味しています。
このファイルを開いてみると、「f.write」に記述したものが書き込まれていることが確認できます。
「f.writelines」を使えば、リストに格納したものをまとめて書き込むことができます。
open文で「mode='x'」とすると、ファイルが存在する場合は「FileExistsError」というエラーになります。
(ファイルがない場合は「mode='w'」と同様にファイルが作られ、それに書き込まれます)
そこで、前項のようにtry~except構文で例外処理を組み込むとこのようになります。
こうすれば、すでにファイルが存在する場合でもコードが停止せずにメッセージが表示されます。
ファイルがなければ (これまでの流れでいえば、左側で右クリック→「ファイルを削除」し、セッションを再起動したあとなら)、改めてファイルを作って書き込みを行います。
「mode='x'」は不自由になるだけにも見えますが、不用意に上書きしたくない場合に役立ちます。
たとえばこのように「status_0.txt」に保存し、
次に同じファイルに保存しようとするとメッセージを表示して上書きを行わず、
別のファイルなら保存できる、のような使い道があります。
(さらに場合分けして「mode='r'」と使い分ければ、ユーザーに「上書きするかどうか」を選ばせることもできます)
open文で「mode='a'」とすると、追記モードでファイルが開かれます。
ファイルがない場合はファイルが作られます。
「students.txt」がない状態でこのコードを実行すると
(Mac環境の人は「¥」を「\」に読み替えてください)
出力ファイルはこのようになります。
もう一度実行すると、元のデータの下にあたらしく行が追加されます。
3人の学生のインスタンスのリスト studentを作り、student.txtにその情報を書き出すコードを記述し、結果を確認してください。
※ 3人の学生のうちどれかを自分の情報にしてください。
※ 2回実行し、テキストファイルの内容が1回目と変化しないことを確認してください。
※ テキストセルを追加し、出力された結果をコピー&ペーストしてください。
(例)
動画の解説を参照
open文で「mode='r'」とすると、読み取りモードでファイルを開きます。
また、f.read でファイルの内容を文字列として読み取れます。
ファイルがない場合は「FileNotFoundError」になります。
前項と同様に、ファイルの有無で場合分けすれば
存在する場合は読み取りを行い、なければメッセージを表示するようにできます。
「f.readlines」では、テキストファイルの行ごとの内容を要素とするリストを取得できます。
それぞれの行から読んだ文字列に対して「.strip().split(', ')」とすると、コンマ区切りで要素を取得できます。
また、「replace」で文字列に含まれる特定の並びを別のものに置き換えられます。
たとえば以下のコードでは lineが「名前: 和島茂, ID: 3125000」なら、
splitによって nameには「名前: 和島茂」、idには「ID: 3125000¥n」が入り、
replaceによって nameが「和島茂」、idが「3125000」になります。
students.txtからデータを読み取り、その情報を持つ Studentのインスタンスをリスト students に追加して最後にその内容を表示するコードを記述してください。
(実行例)