Python の with 文でファイルを安全に扱う
ファイル操作は with 文の最も代表的な使用例です。ファイルを開いたら必ず閉じる必要がありますが、with 文を使えば自動的に処理してくれます。
基本的なファイル読み込み
with open("data.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)
# ブロック終了時に自動で f.close() が呼ばれるwith ブロックを抜けた時点で、ファイルは確実に閉じられます。
with 文を使わない場合の問題
with を使わないと、様々な問題が発生する可能性があります。
# 危険な例
f = open("data.txt", "r")
content = f.read() # ここで例外が発生したら...
f.close() # close() が呼ばれない!例外が発生すると close() が実行されず、ファイルが開いたままになります。これを防ぐには try-finally が必要です。
# 安全だが冗長
f = open("data.txt", "r")
try:
content = f.read()
finally:
f.close()with 文を使えば、この try-finally パターンが自動的に適用されます。
ファイル書き込み
書き込みの場合も同様に安全に扱えます。
with open("output.txt", "w", encoding="utf-8") as f:
f.write("Hello, World!\n")
f.write("こんにちは\n")書き込みモードでは、close() が呼ばれる際にバッファがフラッシュされるため、すべてのデータが確実にファイルに書き込まれます。
行単位の読み込み
ファイルオブジェクトはイテラブルなので、for 文で1行ずつ処理できます。
with open("data.txt", "r", encoding="utf-8") as f:
for line in f:
print(line.strip())この方法は、大きなファイルでも1行ずつメモリに読み込むため効率的です。
例外が発生しても安全
with ブロック内で例外が発生しても、ファイルは必ず閉じられます。
try:
with open("data.txt", "r") as f:
content = f.read()
raise ValueError("何かエラー") # 例外発生
except ValueError as e:
print(f"エラー: {e}")
# 例外が発生しても f.close() は呼ばれているバイナリファイルの処理
画像やバイナリデータも同様に扱えます。
# バイナリ読み込み
with open("image.png", "rb") as f:
data = f.read()
# バイナリ書き込み
with open("copy.png", "wb") as f:
f.write(data)ファイル操作では常に with 文を使う習慣をつけましょう。リソースリークを防ぎ、コードも簡潔になります。












