Pythonで開いたファイルのクローズを忘れやすい人のためのwith文の使い方

open-close

photo credit: dmitryzhkov 8_DSC3575 via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

初心者のためのPythonプログラミングシリーズ、フォルダ作成ツールを作るのを題材に基本中の基本についてお伝えしています。

前回の記事はコチラでした。

Pythonで文字列のスペース・タブ・改行を取り除くstripメソッドの使い方
初心者向けPythonの基本中の基本をフォルダ作成ツールを作りながら学ぶシリーズです。Pythonで簡単に文字列から改行コードを取り除くstripメソッドの使い方です。スペースやタブも除去できますよ。

文字列から改などの空白文字を取り除く方法をお伝えしました。

さて、本ツールではテキストファイルに記載されたフォルダ一覧をもとに、フォルダを自動で作成します。

それでテキストファイルを開くんですが…

忘れちゃうんですよね…ファイルを閉じるの。

で、そんな忘れんぼさんのために、秘策があります!

ということで、Pythonでwith文を使って安全にファイルを開いて閉じる方法です。

では、行ってみましょう。

スポンサーリンク

これまでのファイルの開き方と閉じ方とリスク

これまで本シリーズで紹介してきたテキストファイルの開き方と閉じ方は以下の通りでした。

f = open('area.txt')
# 処理
f.close()

open関数でファイルを開き、closeメソッドでファイルを閉じる。

ちゃんと書いたままにしておけばいいんですが、新しいスクリプトを書いてみたり、あれこれしているうちに忘れてしまうんですよ、closeメソッド。

ファイルをクローズしないと

  • システムのリソースを食ったまま
  • 他のプログラムがファイルにアクセスできなくなる

などのリスクがあります。

今回のようにローカルPCで、ファイル容量も少量で、他のアプリケーションから使わないようなファイルであればさほど問題でもないのですが、そうでもない場合にこの「忘れんぼ」がクセになっていると、よくないことが起きてしまいそうです。

ということで、転ばぬ先の杖。ファイルを自動で閉じてくれるwith文の使い方をさっさとマスターしてしまいましょう。

with文を使ってファイルを開く方法

公式ドキュメントによると、with文は

with 文は、ブロックの実行を、コンテキストマネージャによって定義されたメソッドでラップするために使われます。

とあります。んー、少し難しいですね。

ひとまず、ファイルのオープンの場合を前提とすると以下のように記述します。

with open(file, mode) as 変数:
  # 処理

なんとこれだけで、以下と同様の処理になります。

変数 = open(file, mode)
# 処理
変数.close()

で、closeメソッドはどこ行っちゃったのだということなのですが、ご安心ください。

withブロックを抜けるときにcloseメソッドを勝手に呼び出して実行してくれるのです。

しかも、with文にはもう一つ大きなメリットがあります。公式ドキュメントにはこうも書いてあります。

with を使うと、処理中に例外が発生しても必ず最後にファイルを閉じることができます。

ということで、例外(つまりエラーですね)にも強くなるというメリットがあるわけですね。with文、使わない手はないです。

with文でファイルを開く

では、試してみましょう。

ファイルオブジェクトが開いているかどうかは、closed属性を使って確認できます。

ファイルオブジェクト.closed

Trueなら閉じている、Falseなら閉じていない、つまり開いているとなります。

例えば、以下プログラムでいうと、一つ目のclosedはFalse、二つ目はTrueとなります。

f = open('area.txt')
print(f.closed) #False
f.close()
print(f.closed) #True

では、with文を使ってファイルを開いた場合を見てみましょう。

with open('area.txt') as f:
    print(f.closed) #Fasle
print(f.closed) #True

withブロック内ではclosed属性はFalseとなっていますが、ブロックを抜けたらTrueですね。ちゃんとクローズされているようです。

フォルダ作成ツールをwith文で書き直す

ということで、今までのフォルダ作成ツールのテキストファイルを開く処理について、with文で書き直してみます。

テキストファイルからreadメソッドを使って、テキストファイルをまとめて文字列として読み込むパターンはこうなりますね。

import os
with open('area.txt') as f:
    areas = f.read().split()
for area in areas:
    if os.path.exists(area):
        print('フォルダ ' + area + ' は既に存在しています')
    else:
        os.mkdir(area)

一方で、テキストファイルからreadlinesメソッドを使って、一行ずつリストの要素として読み込むパターンはこちらです。

import os
with open('area.txt') as f:
    areas = f.readlines()
for area in areas:
    area = area.rstrip()
    if os.path.exists(area):
        print('フォルダ ' + area + ' は既に存在しています')
    else:
        os.mkdir(area)

これで、だいぶちゃんとしたツールっぽくなってきましたね。

まとめ

Pythonで安全かつスマートにファイルを開くwith文の使い方についてお伝えしました。

with文を使えばファイルのクローズを自動でしてくれるだけでなく、ブロック内で例外が起きた時も安心、そしてスッキリ書けるというメリットがあります。使わない手はありません。

精神衛生上にも良いですよね。

さて、次回は元データとしてcsvを使ってみたいと思います。

Pythonでcsvファイルからデータを読み込む最初の一歩
初心者向けにPythonの基本中の基本をフォルダ作成ツールを作りながら学ぶシリーズです。今回はPythonでcsvファイルをデータを読み込む最初の一歩についてお伝えします。Readerオブジェクトについても触れますよ。

どうぞお楽しみに!

連載目次:【初心者向けPython】基本の基本を学びながらフォルダ操作

非エンジニアの一般ビジネスマンの初心者向けにPythonでWindowsのファイルやフォルダを操作する簡単便利ツールの作り方を解説しながら、Pythonプログラミングの基本中の基本を学んでいくシリーズです。
  1. Pythonで標準ライブラリのモジュールをインポートして使ってみよう
  2. Pythonでosモジュールのmkdir関数を使ってフォルダを作成する超簡単なプログラム
  3. Pythonプログラミングの基本中の基本!forループによる繰り返しの作り方
  4. Pythonでデータをまとめて取り扱う基本中の基本!リストの使い方とforループ
  5. Pythonで指定したフォルダが存在しているかどうかを調べるos.path.existsの使い方
  6. Pythonで条件分岐をする基本中の基本!if~else文の作り方
  7. Pythonでテキストファイルを開いてデータを読み込む基本中の基本
  8. Pythonで文字列を区切り文字や改行で分割してリスト化するsplitメソッドの使い方
  9. Pythonで文字列のスペース・タブ・改行を取り除くstripメソッドの使い方
  10. Pythonで開いたファイルのクローズを忘れやすい人のためのwith文の使い方
  11. Pythonでcsvファイルからデータを読み込む最初の一歩
タイトルとURLをコピーしました