簡體   English   中英

在 Pillow 中打開和加載圖像時出現“打開的文件太多”錯誤

[英]“Too many open files” error when opening and loading images in Pillow

運行以下代碼時:

KEEP=[]
for file in glob.glob("./KEEP/thing*.[tT][iI][fF]"):
    m = pattern.search(file)
    filename=m.group(1)
    keep=Image.open(file)
    keep.load()
    KEEP.append(keep)
    KEEP_NAMES.append(filename)
    keep.close()

超過一千個文件,我收到錯誤消息:

Traceback (most recent call last):
  File "/hom/yannis/texmf/python/remove-harakat.py", line 123, in <module>
  File "/usr/local/lib/python2.7/dist-packages/PIL/Image.py", line 2237, in open
IOError: [Errno 24] Too many open files: './KEEP/thing1118_26.TIF'

我不明白為什么會發生這種情況,因為我正在加載()然后關閉()所有文件,為什么它們應該保持打開狀態? 除了減少文件數量(這對我來說不是一個選擇)之外,是否有解決此問題的方法? 在內存中讀取內容后關閉它們的某種方法?

這可能是Image.load方法的錯誤 - 請參閱Pillow issue #1144 我遇到了同樣的too many open files錯誤 - 請參閱#1237

我的解決方法是將圖像加載到臨時對象中,進行復制,然后明確關閉臨時對象。 對於您的代碼,它看起來像這樣:

KEEP=[]
for file in glob.glob("./KEEP/thing*.[tT][iI][fF]"):
    m = pattern.search(file)
    filename = m.group(1)
    temp = Image.open(file)
    keep = temp.copy()
    KEEP.append(keep)
    KEEP_NAMES.append(filename)
    temp.close()

我也遇到了這個問題,並用稍微不同的方法解決了這個問題。

此解決方法使用copy.deepcopy() ,它基於copy.deepcopy()解決方案的類似邏輯,但避免創建temp 請參閱下面的代碼片段

import copy

KEEP=[]
for file in glob.glob("./KEEP/thing*.[tT][iI][fF]"):
    m = pattern.search(file)
    filename = m.group(1)
    keep = copy.deepcopy(Image.open(file))
    KEEP.append(keep)
    KEEP_NAMES.append(filename)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM