web-dev-qa-db-ja.com

PermissionError:[WinError 32]プロセスは別のプロセスによって使用されているため、ファイルにアクセスできません

私のコードは、フォルダーを見て、1920x1080の解像度の画像を削除するスクリプト用です。私が抱えている問題は、コードが実行されるときです。

import os
from PIL import Image

while True:    
    img_dir = r"C:\Users\Harold\Google Drive\wallpapers"
    for filename in os.listdir(img_dir):
        filepath = os.path.join(img_dir, filename)
        im = Image.open(filepath)
        x, y = im.size
        totalsize = x*y
        if totalsize < 2073600:
            os.remove(filepath)

このエラーメッセージが表示されます。

Traceback (most recent call last):
  File "C:\Users\Harold\Desktop\imagefilter.py", line 12, in <module>
    os.remove(filepath)
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\Harold\\Google Drive\\wallpapers\\Car - ABT Audi RS6-R [OS] [1600x1060].jpg'

確認するために、Pythonが私のコンピューターで実行されている唯一のプログラムです。この問題の原因は何ですか?どうすれば修正できますか?

13
user2885647

あなたのプロセスはファイルを開いたものです(imを介してまだ存在します)。削除する前に、まず閉じる必要があります。

PILがwithコンテキストをサポートしているかどうかはわかりませんが、サポートしていた場合:

import os
from PIL import Image

while True:    
    img_dir = r"C:\Users\Harold\Google Drive\wallpapers"
    for filename in os.listdir(img_dir):
        filepath = os.path.join(img_dir, filename)
        with Image.open(filepath) as im:
            x, y = im.size
        totalsize = x*y
        if totalsize < 2073600:
            os.remove(filepath)

これにより、os.removeに到達する前に、必ずimを削除(およびファイルを閉じ)してください。

そうでない場合は、PILの開発はほぼ終了しているため、Pillowを確認することをお勧めします。

11
Mike DeSimone

私は同じ問題に直面していましたが、エラーは断続的でした。ファイルのオープン/クローズを正しくコーディングしてもこのエラーが発生する場合は、DropboxやGoogleドライブなどとファイルを同期していないことを確認してください。Dropboxを一時停止したため、エラーは表示されなくなりました。

8
Cleverlike

これは基本的に許可エラーです。削除する前にファイルを閉じるだけです。画像サイズ情報を取得したら、画像を閉じます

im.close()
1
Ayesha