pythonのopen
pythonでファイルを開くときは組込関数のopen
を使う。open
を使うとファイルオブジェクトを返してくれるので、ファイルオブジェクトの持つAPIを使ってファイルの読み書きができるようになる。
ファイルオブジェクトというのはディスク上のファイル等にアクセスするために用意されたAPIであり、pythonでは標準的にはopen
を使って呼び出す。非常に基本的な操作なので、Pythonを扱う人なら誰もが使う機能である。
ファイルオブジェクトのclose
open
を使うときはwith
句とセットにして使うか、close
メソッドを明示的に使うかの処理を行う必要がある。
with open('xxxxx.txt', 'r') f:
contents = f.read()
f = open('xxxxx.txt', 'r')
contents = f.read()
f.close()
このように何かしらの形でファイルオブジェクトを閉じる必要があるのは、ファイルオブジェクトを大量にあけてしまうとToo many open files
のOS Errorを起こしてしまうためである。
画像を扱うpillowのImage
pythonで画像を開くときによく使われるのがpillowのモジュールのImage
である。
from PIL import Image
im = Image.open('xxxxx.jpg')
ファイルにアクセスするので内部的にファイルオブジェクトを生成しているはずだが、組込のopen
と同様に、with
やclose
を使わなくてもいいのか。
Imageのライフサイクル
Image
はopen
したときにファイルオブジェクトを作る。そして、実際に画像データを読み込むときにload
メソッドが内部的に実行される。これが実行されると自動的にファイルオブジェクトはclose
される(ただし、これはsingle-frameのpngやjpg等の話で、multi-frameのgif等ではclose
されないことに注意)。このため、Image
はclose
のメソッドも持つが、通常の場合はclose
しなくても問題なくなる。
まとめると、
- jpgやpngなどのsingle-frameの画像ファイルの読み込みでは、
close
をする必要はない。 - ただし、gifなどのmulti-frameの画像ファイルを読み込む場合は勝手に
close
されないので注意。
所感
- 画像を扱うときに一回データを呼び出したら、ファイルオブジェクトを再度使うことはあまり想定されないと思うのでよくできた仕組みだなあと思った。
- よくできた仕組みではあるが、組込の
open
との違いをちゃんと把握しておかないと混乱しそうだなあと思った。