Python初心者でもわかるwith文の解説

Python初心者でもわかるwith文の解説 プログラミング

「正直、with文がよくわからない・・・」
「ファイル読み込み処理でclose()を書き忘れたことがある・・・」
「Pythonによる開発において、コード品質をもっと上げたい」

このような場合には、この記事が参考となります。
この記事では、Pythonにおけるwith文について初心者向けに解説しています。

本記事の内容

  • with文とは?
  • with文と例外処理

それでは、上記に沿って解説していきます。

with文とは?

with文を使うと、コーディングの質を改善できます。

例えば、以下のようなファイル読み込み処理のコードがあるとします。

file = open("file1.txt")
text = "read=" + file.read()
print(text)
file.close()

上記コードでは、「file.close()」でファイルオブジェクトを開放しています。
オブジェクトの開放は、原則必須です。

オブジェクトの開放は基本中の基本です。
開放しないと、メモリ上にリソースが残ったままとなります。

しかし、コードが複雑になってくると開放漏れが生じることもありえます。
ミスは誰にでもありますからね。

そんなミスを未然に防いでくれるのが、with文と言えます。
with文を使うと、上記のコードは次のように書き換えることができます。

with open("file1.txt") as file:
    text = "read=" + file.read()
    print(text)

close関数が、不要になりました。
with文を使うと、自動的にオブジェクトの開放をしてくれます。

まず、これで開放漏れのミスがなくなります。
さらに、コードが見やすくなっています。

行数が減ったことに加え、コードの内容も理解しやすくなっています。
with文があることにより、オブジェクトの読み込み・接続が実施されていることがわかります。
簡単に言うと、ソースの可読性が上がります。

したがって、with文を使わないと勿体ないのです。
もし食べず嫌いなら、一度with文を味わってみてください。

以上、with文について説明しました。
次は、with文と例外処理について確認します。

with文と例外処理

先ほどは、with文のメリットを挙げました。

  • オブジェクトの開放(close関数)不要→ミス防止
  • ソースの可読性向上

with文には、さらにメリットが存在します。
例外発生時にノーダメージという利点があります。

Pythonにおける例外処理については、次の記事で解説しています。

まずは、with文を利用しない場合で確認しましょう。
下記コードのままだと、file1.txtが存在しない場合に例外が発生します。

file = open("file1.txt")
text = "read=" + file.read()
print(text)
file.close()

エラー内容は、以下となります。

FileNotFoundError: [Errno 2] No such file or directory: 'file1.txt'

そして、途中で処理が止まったため、close関数が実行されていません。
つまり、オブジェクトは未開放のままということです。

これは、大変マズイです。
そのため、例外処理を加えましょう。

file = None
try:
    file = open("file1.txt")
    text = "read=" + file.read()
    print(text)
except:
    print("例外発生")
finally:
    print("開放")
    if file is not None:
        file.close()

上記コードでfile1.txtが存在しない場合は、以下の結果となります。

例外発生
開放

なお、成功時は次の結果になります。

read=1
開放

file1.txtのファイルには、「1」が記載されています。

では、with文を利用している際に例外が発生したらどうなるのでしょうか?
結論から言うと、オブジェクトは自動的に開放されます。

ただし、エラーで処理は止まってしまいます。
そのため、止めないためには次のように対応します。

try:
    with open("file1.txt") as file:
        text = "read=" + file.read()
        print(text)
except:
    print("例外発生")

例外処理を考慮すると、with文を使うメリットはさらに増えますね。
with文を使う場合と使わない場合とでは、コード量が倍近く異なります。

以上、with文と例外処理について説明しました。

タイトルとURLをコピーしました