LoginSignup
peco-poco
@peco-poco (peco poco)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

TIFファイルの分割、OSError: [Errno 24] Too many open files:

解決したいこと

python で複数のマルチtiffを分割しました。
複数を順番に処理するとエラーが発生しました。
解決方法をお教えくださいませ。

環境
OS:windows
python 3.85
PCによっては動作します。

発生している問題・エラー

Traceback (most recent call last):
  File "test2.py", line 11, in <module>
  File "test2.py", line 7, in DIV
  File "C:\Users\dcuser03\anaconda3\lib\site-packages\PIL\Image.py", line 2169, in save
OSError: [Errno 24] Too many open files: '0456.jpg'

エラー箇所

OSError: [Errno 24] Too many open files: '0456.jpg'

該当するソースコード

import glob
from PIL import Image, ImageSequence

def DIV(N):
    img = Image.open(N)
    for i, page in enumerate(ImageSequence.Iterator(img)):
        page.save("{}.jpg".format(str(i+1).zfill(4)), format='jpeg', quality=95)

L=glob.glob("*.TIF")
for j in L:
    DIV(j)

エラー箇所

for i, page in enumerate(ImageSequence.Iterator(img)):
        page.save("{}.jpg".format(str(i+1).zfill(4)), format='jpeg', quality=95)

自分で試したこと

withやcloseで閉じ、ファイルディスクリプタ上限に達しないよう工夫しましたが結果は同じでした。

工夫したコード(同様のエラー)

def DIV(N):
    with Image.open(N) as im:
        index = 1
        for frame in ImageSequence.Iterator(im):
            frame.save(N[:11] + "{}.jpg".format(str(index+1).zfill(4)), format='jpeg', quality=95)
            index += 1

何卒お願い申し上げます。

0

2Answer

工夫したコードで、imをコピーして、コピーをImageSequence.Iteratorに渡してみたら、どうでしょうか?

下記のコードのように:

0

Comments

  1. @peco-poco

    Questioner
    コメント欄に状況を追加いたしました
    何卒宜しくお願い致します

お教えいただき誠にありがとうございます!
まだうまくいっていません。

下記2つを試しました。
内容は同じです(withブロックの有無)

def DIV(N):
    im = Image.open(N)
    co_im = im.copy() #co_im = copy.copy(im)も同様
    im.close()
    index = 1
    for f in ImageSequence.Iterator(co_im):
        f.save(N[:11] + "{}.jpg".format(str(index).zfill(4)), format='jpeg', quality=95)
        index += 1
def DIV(N):
    with Image.open(N) as im:
        co_im = copy.copy(im)
    index = 1
    for f in ImageSequence.Iterator(co_im):
        f.save(N[:11] + "{}.jpg".format(str(index).zfill(4)), format='jpeg', quality=95)
        index += 1

結果、Tiffファイルの一枚目のみをjpgとして保存。つまり1000枚以上あるその他の画像は正しく分割、保存されませんでした。

次に

co_im = copy.deepcopy(im)

としてみたところ
下記エラーが出てしまいました。

引き続き工夫していきます。

何卒お教えいただければ幸甚に存じます。

Traceback (most recent call last):
  File "T2C_ver1.00.py", line 37, in <module>
    DIV(i)
  File "T2C_ver1.00.py", line 22, in DIV
    for f in ImageSequence.Iterator(co_im):
  File "C:\Users\dcuser03\anaconda3\lib\site-packages\PIL\ImageSequence.py", line 49, in __next__
    self.im.seek(self.position)
  File "C:\Users\dcuser03\anaconda3\lib\site-packages\PIL\TiffImagePlugin.py", line 1044, in seek
    if not self._seek_check(frame):
  File "C:\Users\dcuser03\anaconda3\lib\site-packages\PIL\ImageFile.py", line 300, in _seek_check
    frame < self._min_frame
  File "C:\Users\dcuser03\anaconda3\lib\site-packages\PIL\Image.py", line 541, in __getattr__
    raise AttributeError(name)
AttributeError: _min_frame
0

Your answer might help someone💌