Как исправить проблему с обработкой файла PIL и разрешением shutil в цикле Image.open? - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть группа файлов .pdf, из которых я создал изображения .tiff. Файлы .pdf называются «Install_Form_XXXXXX.pdf», а последующие файлы .tiff - «Install_Form_XXXXXX_1.tiff». В некоторых случаях .pdf может иметь две страницы, и в этом случае создается второй файл «Install_Form_XXXXXX_2.tiff».

Поэтому я перебираю список файлов «Install_Form_XXXXXX_X.tiff» и использую PIL и Numpy для объединения изображений по горизонтали. Это прекрасно работает, используя цикл в моем коде ниже, но затем мне нужно переименовать новый «комбинированный_XXXXXX.tiff» в исходное имя «Install_Form_XXXXXX_1.tiff» и перезаписать его.

Мой цикл неправильно закрывает два открытых изображения перед запуском shutil.move () в последней строке цикла. Итак, я получаю сообщение об ошибке ниже, которое показывает ошибку разрешения и «Не удается создать файл, когда этот файл уже существует». Однако, если я переместлю последнюю строку за пределы цикла и вручную укажу путь к файлу и имена, я смогу переместить новый комбинированный .tiff, чтобы перезаписать существующий.

Как правильно закрыть эти изображения в цикле, чтобы разрешить переименовывать объединенный .tiff в "Install_Form_XXXXXX_1.tiff"?

Я удалил ссылки на пути к файлам из своего кода для удобства просмотра. Код конкатенации изображения взят из этого предыдущего ответа .

Мой код:

import numpy as np
from PIL import Image
from shutil import move

install_list = ['166292']

for x in install_list:
    install_form_1 = "Install_Form_%s_1.tiff"  % (x)
    install_form_2 = "Install_Form_%s_2.tiff"  % (x)
    combined_form = 'combined_%s.tiff' % (x)
    list_im = [install_form_1, install_form_2]
    imgs = [ Image.open(i) for i in list_im ]
    min_shape = sorted( [(np.sum(i.size), i.size ) for i in imgs])[0][1]
    imgs_comb = np.hstack( (np.asarray( i.resize(min_shape) ) for i in imgs ))
    imgs_comb = Image.fromarray(imgs_comb)
    imgs_comb.save(combined_form)

    move(combined_form, install_form_1)

Сообщение об ошибке из кода:

(base) C:\Combine_Images.py
  imgs_comb = np.hstack( (np.asarray( i.resize(min_shape) ) for i in imgs ) )
Traceback (most recent call last):
  File "C:\lib\shutil.py", line 563, in move
    os.rename(src, real_dst)
FileExistsError: [WinError 183] Cannot create a file when that file already exists: 'C:\\combined_166292.tiff' -> 'C:\\Install_Form_166292_1.tiff'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:/Combine_Images.py", line 43, in <module>
    move(filepath + combined_form, filepath + install_form_1)
  File "C:\lib\shutil.py", line 577, in move
    copy_function(src, real_dst)
  File "C:\lib\shutil.py", line 263, in copy2
    copyfile(src, dst, follow_symlinks=follow_symlinks)
  File "C:\lib\shutil.py", line 121, in copyfile
    with open(dst, 'wb') as fdst:
PermissionError: [Errno 13] Permission denied: 'C:\\Install_Form_166292_1.tiff'
...