Python PIL, сохраняя последнее изображение в памяти - PullRequest
0 голосов
/ 25 сентября 2018

В моем коде я перебираю CSV-файл, и для каждой строки изображение присваивается на основе одного из значений. Например:

if 'V,S,M' in s.com:
    compic = Image.open('Com-VSM.png')
elif "V,S" in s.com:
    compic = Image.open('Com-VS.png')
elif "V,M" in s.com:
    compic = Image.open('Com-VM.png')
elif "S,M" in s.com:
    compic = Image.open('Com-SM.png')
elif "V" in s.com:
    compic = Image.open('Com-V.png')
elif "S" in s.com:
    compic = Image.open('Com-S.png')
elif "M" in s.com:
    compic = Image.open('Com-M.png')

Однако я замечаю, что иногда Pythonудерживает изображение, использованное в последнем цикле, поэтому, если List [1] использует Com-M.png, а List [2] использует Com-S.png, то получается, что при создании изображения List [2] будет ли 'Com-S.png' наложен поверх 'Com-M.png' каких-либо предположений о том, как это исправить?

Полный цикл (сборщик мусора был попыткой сильно очистить память):

for s in L:
    scho = 0

    if 'Necromancy' in s.school:
        scho = necromancy
    elif 'Abjuration' in s.school:
        scho = abjuration
    elif 'Conjuration' in s.school:
        scho = conjuration
    elif 'Divination' in s.school:
        scho = divination
    elif 'Evocation' in s.school:
        scho = evocation
    elif 'Enchantment' in s.school:
        scho = enchantment
    elif 'Illusion' in s.school:
        scho = illusion
    elif 'Transmutation' in s.school:
        scho = transmutation
    else:
        scho = abjuration

    compic = 0
    font = ImageFont.truetype("Livingst.ttf", 48)


    #region Components
    if 'V,S,M' in s.com:
        compic = Image.open('Com-VSM.png')
    elif "V,S" in s.com:
        compic = Image.open('Com-VS.png')
    elif "V,M" in s.com:
        compic = Image.open('Com-VM.png')
    elif "S,M" in s.com:
        compic = Image.open('Com-SM.png')
    elif "V" in s.com:
        compic = Image.open('Com-V.png')
    elif "S" in s.com:
        compic = Image.open('Com-S.png')
    elif "M" in s.com:
        compic = Image.open('Com-M.png')
    else:
        compic = Image.open('Com-VSM.png')
    #endregion

    image_copy = scho.image
    image_copy.paste(compic, scho.point5, compic)
    imgpath = 's.name + '.png'
    image_copy.save(imgpath)
    del compic
    gc.collect()

1 Ответ

0 голосов
/ 26 сентября 2018

В вашем if ... elif ... вы забыли else заявление.Таким образом, переменная compic не устанавливается в каждом цикле, если не выполняются никакие условия.

Все, что вам нужно, это добавить оператор else для проверки всех случаев.

Если у вас его нет, лучше всего поднять NotImplementedError, например:

if 'V,S,M' in s.com:
    compic = Image.open('Com-VSM.png')
elif "V,S" in s.com:
    compic = Image.open('Com-VS.png')
elif "V,M" in s.com:
    compic = Image.open('Com-VM.png')
elif "S,M" in s.com:
    compic = Image.open('Com-SM.png')
elif "V" in s.com:
    compic = Image.open('Com-V.png')
elif "S" in s.com:
    compic = Image.open('Com-S.png')
elif "M" in s.com:
    compic = Image.open('Com-M.png')
else:
    raise NotImplementedError(s.com)

Таким образом, легче найти пропущенные случаи

...