← トップ
17 / 20

17. コンテキストマネージャ(with文)

CONCEPT

コンテキストマネージャcontext manager。with文で使う、リソースの自動管理は、「使い始め」と「使い終わり」を自動で管理する仕組みです。電気をつけて部屋に入り、出るときに消すのを自動でやってくれるスイッチのようなものです。

📍 使い道: ファイルを開いて使い終わったら自動で閉じる
COMMON MISTAKES — よくある間違い
with ブロックの外でリソースを使うwith open(...) as f: の中でのみファイルにアクセスできます。外ではファイルは閉じています。
__exit__ の戻り値を間違える__exit__ で True を返すと例外が握りつぶされます。基本は None(または False)を返します。
コードを1行ずつ実行してみよう
example.pyPython
1with open("orders.csv", "w") as f:# orders.csv を書き込みモードで開き、f という名前にする
2 f.write("商品,金額\n")# ファイルに "商品,金額\\n" を書き込む
3 f.write("りんご,150\n")# ファイルに "りんご,150\\n" を書き込む
4# ← ここで自動的にファイルが閉じられる# インデントを抜けたので自動的にファイルが閉じられた
« 次の行 » ボタンを押して実行を開始
VARIABLES
実行すると変数の状態が表示されます
with文は「開始と終了をセットで管理」する仕組みです。 with open(...) as f: と書けば、ファイルは必ず最後に閉じられます。 「使い終わったら必ず片付ける」を自動化する仕組みです。
📚 読み方ガイド
コード読み方
with open(...) as f:ファイルを開いて、fファイルオブジェクト(英: file) という名前で使う
f.write("テキスト")fファイルオブジェクト(英: file)に書き込む
with sqlite3.connect(...) as conn:DB接続を開いて、conn という名前で使う
# インデントを抜けると自動閉じるwith ブロックを抜けると自動的に後処理が実行される
KEY POINT

コンテキストマネージャcontext manager。with文で使う、リソースの自動管理では、with = 「このブロックの間だけリソースを使う」という宣言。as f = 開いたファイルを f という名前で使う。インデントを抜けると自動的に後処理(ファイルを閉じる等)が実行される。

確認問題
1インデントを抜けた後はどうなりますか?
with open("log.txt", "w") as f: f.write("アクセスログ: 12:00")
ファイルが自動的に閉じられます。with ブロックを抜けると自動的に後処理(close)が実行されるのがコンテキストマネージャcontext manager。with文で使う、リソースの自動管理の役割です。
2with 文を使わずにファイルを開いた場合、何を自分でやる必要がありますか?
f = open("log.txt", "w") f.write("テキスト") # ???
f.close() を自分で呼ぶ必要があります。閉じ忘れるとリソースリーク(メモリやファイルハンドルの浪費)の原因になります。with 文を使えばこの問題を防げます。
3DatabaseTransaction でエラーが起きたときはどうなりますか?
class DatabaseTransaction: def __exit__(self, exc_type, exc_val, exc_tb): if exc_type is None: self.conn.commit() else: self.conn.rollback() self.conn.close()
エラーが起きた場合(exc_type is not None)、rollback() が実行されて変更が元に戻されます。その後、接続が閉じられます。エラーがなければ commit() で変更が保存されます。
CHEAT SHEET — まとめ
3行で分かる
  • 「使い始め」と「使い終わり」を自動で管理する仕組み
  • with文で開いたら自動で閉じる(閉じ忘れを防ぐ)
  • ファイルやDB接続の安全な取り回しに必須
コンテキストマネージャ