Заполнение списка переменным количеством изображений в Python

#python #list

#python #Список

Вопрос:

Я считываю количество файлов изображений в папке и присваиваю это значение say fnum . Затем я хочу добавить эти изображения в список.

Сначала я получаю изображения, используя:

 import os
fnum = int(len(os.listdir("Photos")))
i = 1
for n in range(fnum):
    globals()["my_img"   str(i)] = ImageTk.PhotoImage(Image.open("Photos/Picture"  str(i)   "_Thumbnail.JPG"))
    i  = 1
  

На данный момент все в порядке.

Например, если fnum равно 6, я могу сделать это с помощью:

 image_list = [my_img1, my_img2, my_img3, my_img4, my_img5, my_img6]
  

но я хочу иметь возможность сделать это для общего случая, чтобы охватить:

 image_list = [my_img1, my_img2, ....., my_img(fnum)]
  

Я попробовал это:

 image_list = []
for i in range(1, fnum):
   image_list.append(my_img   (i))
   i  = 1
  

Вы можете помочь?

Ответ №1:

Вероятно, вы ищете что-то подобное, без каких-либо подобных globals() ошибок:

 import glob

images = []

for path in glob.glob("Photos/Picture*Thumbnail.JPG"):
    image = ImageTk.PhotoImage(Image.open(path))
    images.append(image)
  

Затем вы можете получить доступ к каждому PhotoImage объекту с images[0] помощью , images[1] , и т.д., или перебирать их с for image in images: помощью .

Ответ №2:

Если ваша проблема заключается только в добавлении нового «my_img» номер в список, вы можете использовать добавление или добавление списков:

 #Your code (I am assuming it works)
import os
fnum = int(len(os.listdir("Photos")))
i = 1
for n in range(fnum):
    globals()["my_img"   str(i)] = ImageTk.PhotoImage(Image.open("Photos/Picture"  str(i)   "_Thumbnail.JPG"))
    i  = 1


#Code which uses append
fnum = 6
image_list = []
for i in range(1, fnum):
   image_list.append("my_img"   str(i))
#print (image_list)


#Code which uses append
fnum = 6
image_list = []
for i in range(1, fnum):
   image_list.append("my_img"   str(i))
#print (image_list)


#Change list with names of variables to list with values of these variables
image_list = [globals()[variableName] for image in image_list]
print(image_list)
  

Quciknote: пока вы используете for i в диапазоне, вам не нужно увеличивать I самостоятельно. Диапазон определяет списки, такие как [1, 2, 3, 4, 5, …, fnum] и выбор каждого значения из этого списка для каждой итерации.

Редактировать:

Я добавил строку, которая преобразует список имен в список значений в приведенный выше код.

Комментарии:

1. Спасибо за эти идеи. Я могу заставить его работать для встроенного случая:

2. Если я выполняю прошивку с 6 фотографиями — image_list = [my_img1, my_img2, my_img3, my_img4, my_img5, my_img6] #image_list = [my_img(i), для i = 1, fnum] печать (image_list) Я получаю печать [ Объект PhotoImage в 0x0000017E3150FFD0>, Объект PhotoImage в 0x0000017E33640220>, Объект PhotoImage в 0x0000017E3150FE20>, Объект PhotoImage в 0x0000017E3364B790>, Объект PhotoImage в 0x0000017E3364B8E0>, Объект PhotoImage в 0x0000017E3364B9A0>] >>>

3. Но если я использую вашу версию, я получаю [‘my_img1’, ‘my_img2’, ‘my_img3’, ‘my_img4’, ‘my_img5’] для печати того, что находится в image_list

4. @Bill Ну, похоже, я не до конца понял вашу проблему. =) Однако я обновил свой ответ, поскольку преобразование списка имен в список значений — это всего лишь одна строка кода