雑学1472593 views
世界の国560595 views
MathPython491378 views
いろは2986023 views
中学社会667106 views
英語607877 views
高校倫理1433119 views
高校日本史189857 views
小学理科717236 views
ヒストリア284143 views
Help
Tools

English

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 文を使う習慣をつけましょう。リソースリークを防ぎ、コードも簡潔になります。