Pythonでクリーンアップアクションを定義する方法(try〜finallyの使い方)
プログラムが正常に完了したか、あるいはエラーが発生したかにかかわらず、特定の処理を必ず実行したい場面は数多くあります。こうしたエラーや例外を捕捉するために、一般的にはtryとexceptブロックを使用します。
tryステートメントには、「クリーンアップアクション」を定義するための非常に便利なオプション節が用意されています。クリーンアップアクションとは、どのような状況下でも必ず実行されなければならない処理のことです。例えば、以下のように記述します。
>>> try:
raise SyntaxError
finally:
print("Learning Python!")
Learning Python!
Traceback (most recent call last):
File "<pyshell#11>", line 2, in <module>
raise SyntaxError
File "<string>", line None
SyntaxError: <no detail available>
finally節は何が起きても必ず実行される一方で、else節は例外が発生しなかった場合にのみ実行されるという点に注意してください。
例1:正常にファイルへ書き込みできる場合
まず、すべてが正常に動作し、例外なくファイルへ書き込みが行われるケースを見てみましょう。プログラムは以下のようになります。
file = open('finally.txt', 'w')
try:
file.write("Testing1 2 3.")
print("Writing to file.")
except IOError:
print("Could not write to file.")
else:
print("Write successful.")
finally:
file.close()
print("File closed.")このプログラムを実行すると、次の出力が得られます。
Writing to file.
Write successful.
File closed.
このように、例外が発生しない場合はtryブロック内の処理、続いてelseブロック、最後にfinallyブロックが順番に実行されます。
例2:読み取り専用ファイルへの書き込みで例外を発生させる場合
次に、ファイルを読み取り専用モードで開き、そこへ書き込みを試みることで、意図的に例外を発生させてみましょう。
file = open('finally.txt', 'r')
try:
file.write("Testing1 2 3.")
print("Writing to file.")
except IOError:
print("Could not write to file.")
else:
print("Write successful.")
finally:
file.close()
print("File closed.")このプログラムを実行すると、次のような出力が得られます。
Could not write to file.
File closed.
例外が発生したためelseブロックはスキップされましたが、finallyブロックは確実に実行されていることがわかります。これにより、エラーが発生してもファイルが確実に閉じられることが保証されます。
例3:except句で捕捉できないエラーが発生した場合
エラーが発生したにもかかわらず、それを処理する適切なexcept句が用意されていない場合を考えてみましょう。この場合、クリーンアップアクション(finallyブロック)が先に実行され、その後でインタプリタによってエラーが送出されます。以下の例でこの動作を確認してみましょう。
file = open('finally.txt', 'r')
try:
file.write(4)
print("Writing to file.")
except IOError:
print("Could not write to file.")
else:
print("Write successful.")
finally:
file.close()
print("File closed.")出力結果
File closed.
Traceback (most recent call last):
File "C:/Python/Python361/finally_try_except1.py", line 4, in <module>
file.write(4)
TypeError: write() argument must be str, not int
ここでは整数値を書き込もうとしたためTypeErrorが発生しましたが、これはIOErrorを捕捉するexcept句では対応できません。それでも出力結果を見ると、トレースバックが表示される前に「File closed.」が出力されています。つまり、finallyブロックが先に実行されたことがわかります。
まとめ
以上の例から、finally節は例外が発生したかどうかにかかわらず、常に実行されることが確認できました。ファイルのクローズやリソースの解放など、確実に実行したい後処理がある場合は、try〜finally構文を活用することで、プログラムの堅牢性を高めることができます。
-
【Python】ジャンクファイルオーガナイザーで面倒なファイル整理を一括自動化
はじめに 大量のファイルやフォルダをひとつのディレクトリに放り込みっぱなしにして、「何のファイルがあったんだっけ?」と混乱しがちなPythonプログラマーは少なくありません。そんな「怠惰(=効率重視)」な開発者にとって、手作業でのファイル整理は面倒この上ないものです。 そこで本記事では、散らかったフォルダ内のファイルを拡張子ごとに適切なフォルダへ一括で振り分け、さらに不要になった空のディレクトリまで削除してくれるPythonスクリプトを紹介します。コマンドひとつでフォルダがすっきり片付くので、ぜひ活用してみてください。 具体的には、さまざまな種類のファイルが混在したディレクトリ(下図)を入力と
-
PythonのopenpyxlモジュールでExcelファイルを読み書きする方法【初心者向け完全ガイド】
Pythonには、Excelファイル(.xlsx)を操作するためのopenpyxlという便利なモジュールが用意されています。このモジュールを使えば、Excelファイルの新規作成、データの書き込み・読み取り、シートの追加や管理など、さまざまな操作をプログラムから自動的に行うことができます。 本記事では、openpyxlの基本的な使い方を、実際に動作するサンプルコードとともに順番に解説していきます。 openpyxlのインストール方法 openpyxlは標準ライブラリではないため、まずインストールが必要です。コマンドプロンプト(またはターミナル)で以下のコマンドを実行してください。 pip ins