プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

Pythonでos.remove()を使って条件を指定してファイルを削除しようとするとPermissionErrorになる

発生した問題

f:id:s51517765:20201205182934p:plain

Pythonで条件を指定してフォルダの画像ファイル(ここではpxが100x100以下)を削除しようとしたらPermissionErrorと怒られました。

以下のようにPILで画像を開いてサイズを取得、条件に一致したら削除、というようなことをやろうとしました。

from PIL import Image
os.chdir(r"C:\Users\***\Documents\***")
files = glob.glob("./*")
for file in files:
    if ".jpeg" in file: #拡張子で画像をさがす
        img = Image.open(file)
        if img.height <= 100 and img.width <= 100:
            print(file)
            os.remove(file)

これは言われているError自体は、他のプロセスが画像を開いている(掴んでいるって言ったりする)から削除できません、という簡単なことではありますが、じゃあどうやってプロセスを開放すればいいの?というところです。

答え

delしてあげればよい。

del img

delはオブジェクトや変数を削除する構文です。
オブジェクトというのは、慣れてしまえば気にしなくなりますが、変数や変数の箱?のようなもので、これを削除するとは定義する前の状態に戻ることです。
例えば、ここで間違った書き方をしてdel fileとすると、os.remove(file)のところで

例外が発生しました: UnboundLocalError
local variable 'file' referenced before assignment

のようになります。

修正後のコード

from PIL import Image
os.chdir(r"C:\Users\***\Documents\***")
files = glob.glob("./*")
for file in files:
    if ".jpeg" in file:
        img = Image.open(file)
        if img.height <= 100 and img.width <= 100:
            print(file)
            del img
            os.remove(file)