2009-04-17 1 views
1

Я использую функцию генератора python, чтобы предоставить мне список изображений в текущем каталоге. Однако я вижу, что функция выделяет весь список дважды, а не один раз, и я понятия не имею, почему. Я использую Python PIL-библиотеку для создания миниатюр партии.Функция генератора выполняется дважды?

Может ли кто-нибудь указать мне в правильном направлении?

Сценарий:


import os 
import sys 
import Image 

class ThumbnailGenerator: 
    def __init__(self, width, height, image_path, thumb_path): 
     self.width = width 
     self.height = height 
     self.image_path = image_path 
     self.thumb_path = "%s%s%s" % (self.image_path, os.sep, thumb_path) 

    def __call__(self): 
     self.__create_thumbnail_dir() 

     for filename, image in self.__generate_image_list(): 
      try: 
       thumbnail = "%s%s%s" % (self.thumb_path, os.sep, filename) 
       image.thumbnail((self.width, self.height)) 
       image.save(thumbnail, 'JPEG') 
       print "Thumbnail gemaakt voor: %s" % filename 
      except IOError: 
       print "Fout: thumbnail kon niet gemaakt worden voor: %s" % filename 

    def __generate_image_list(self): 
     for dirpath, dirnames, filenames in os.walk(self.image_path): 
      count = 0 
      for filename in filenames: 
       try: 
        image = Image.open(filename) 
        print '=========', count, filename 
        count += 1 
        yield (filename, image) 
       except IOError: 
        pass 

    def __create_thumbnail_dir(self): 
     try: 
      os.mkdir(self.thumb_path) 
     except OSError as exception: 
      print "Fout: %s" % exception 

if __name__ == '__main__': 
    try: 
     thumbnail_generator = ThumbnailGenerator(80, 80, '.', 'thumbs') 
     thumbnail_generator() 
    except KeyboardInterrupt: 
     print 'Programma gestopt' 

Выход сценария в данный момент (с некоторыми тестовыми изображениями) является:

 
========= 0 124415main_image_feature_380a_ys_full.jpg 
Thumbnail gemaakt voor: 124415main_image_feature_380a_ys_full.jpg 
========= 1 60130main_image_feature_182_jwfull.jpg 
Thumbnail gemaakt voor: 60130main_image_feature_182_jwfull.jpg 
========= 2 assetImage.jpg 
Thumbnail gemaakt voor: assetImage.jpg 
========= 3 devcon-c1-image.gif 
Fout: thumbnail kon niet gemaakt worden voor: devcon-c1-image.gif 
========= 4 image-646313.jpg 
Thumbnail gemaakt voor: image-646313.jpg 
========= 5 Image-Schloss_Nymphenburg_Munich_CC.jpg 
Thumbnail gemaakt voor: Image-Schloss_Nymphenburg_Munich_CC.jpg 
========= 6 image1w.jpg 
Thumbnail gemaakt voor: image1w.jpg 
========= 7 New%20Image.jpg 
Thumbnail gemaakt voor: New%20Image.jpg 
========= 8 samsung-gx20-image.jpg 
Thumbnail gemaakt voor: samsung-gx20-image.jpg 
========= 9 samsung-image.jpg 
Thumbnail gemaakt voor: samsung-image.jpg 
========= 0 124415main_image_feature_380a_ys_full.jpg 
Thumbnail gemaakt voor: 124415main_image_feature_380a_ys_full.jpg 
========= 1 60130main_image_feature_182_jwfull.jpg 
Thumbnail gemaakt voor: 60130main_image_feature_182_jwfull.jpg 
========= 2 assetImage.jpg 
Thumbnail gemaakt voor: assetImage.jpg 
========= 3 devcon-c1-image.gif 
Fout: thumbnail kon niet gemaakt worden voor: devcon-c1-image.gif 
========= 4 image-646313.jpg 
Thumbnail gemaakt voor: image-646313.jpg 
========= 5 Image-Schloss_Nymphenburg_Munich_CC.jpg 
Thumbnail gemaakt voor: Image-Schloss_Nymphenburg_Munich_CC.jpg 
========= 6 image1w.jpg 
Thumbnail gemaakt voor: image1w.jpg 
========= 7 New%20Image.jpg 
Thumbnail gemaakt voor: New%20Image.jpg 
========= 8 samsung-gx20-image.jpg 
Thumbnail gemaakt voor: samsung-gx20-image.jpg 
========= 9 samsung-image.jpg 
Thumbnail gemaakt voor: samsung-image.jpg 

Хотя это должно быть:

 
========= 0 124415main_image_feature_380a_ys_full.jpg 
Thumbnail gemaakt voor: 124415main_image_feature_380a_ys_full.jpg 
========= 1 60130main_image_feature_182_jwfull.jpg 
Thumbnail gemaakt voor: 60130main_image_feature_182_jwfull.jpg 
========= 2 assetImage.jpg 
Thumbnail gemaakt voor: assetImage.jpg 
========= 3 devcon-c1-image.gif 
Fout: thumbnail kon niet gemaakt worden voor: devcon-c1-image.gif 
========= 4 image-646313.jpg 
Thumbnail gemaakt voor: image-646313.jpg 
========= 5 Image-Schloss_Nymphenburg_Munich_CC.jpg 
Thumbnail gemaakt voor: Image-Schloss_Nymphenburg_Munich_CC.jpg 
========= 6 image1w.jpg 
Thumbnail gemaakt voor: image1w.jpg 
========= 7 New%20Image.jpg 
Thumbnail gemaakt voor: New%20Image.jpg 
========= 8 samsung-gx20-image.jpg 
Thumbnail gemaakt voor: samsung-gx20-image.jpg 
========= 9 samsung-image.jpg 
Thumbnail gemaakt voor: samsung-image.jpg 

Как вам может видеть, что функция генератора дважды возвращает список (я проверил его и вызывается только один раз).

@heikogerlach: os.walk не может найти миниатюры, поскольку я иду по именам текущего каталога, а миниатюры записываются в подпапку текущего каталога под названием «большой палец». Список создается перед записью миниатюр в «большой палец», и я проверил (используя WinPDB), что миниатюры не включены в список.

@ S.Lott: Спасибо за совет. os.path.join исправил проблему.

ответ

3

В вашей отладке напечатайте полный путь. Я думаю, что вы идете в подкаталог thumbs после того, как идете по каталогу ..

Также.

class ThumbnailGenerator(object): 

Обычно в конечном итоге лучше всего работает.

Пожалуйста, НЕ используйте __ перед вашими именами методов (generate_image_list и create_thumbnail_dir).

Не используйте "%s%s%s" % (self.image_path, os.sep, thumb_path) для создания названий путей, используйте os.path.join.

+0

Почему класс подкласса класса из объекта является предпочтительным? –

+1

@Paolo: он определяет классы нового стиля. См. Http://www.python.org/doc/newstyle/ – nosklo

0

Ваши миниатюры находятся в подкаталоге self.image_path и имеют то же имя, что и у исходного изображения. Можете ли вы проверить, найдет ли гуляк, как вы их создаете? Просто напечатайте путь изображения вместе с именем.

+0

os.walk не может найти миниатюры, поскольку я иду по именам текущего каталога, а миниатюры записываются в подпапку текущего каталога под названием «большой палец». Список создается перед записью миниатюр в «большой палец», и я проверил (используя WinPDB), что миниатюры не включены в список. – 2009-04-17 14:49:29

+0

@ python-newbe: os.walk() также спускается в подкаталоги. И нет фиксированного списка. Его генератор, который может просто генерировать больше имен файлов после их использования. – 2009-04-17 14:58:00

 Смежные вопросы

  • Нет связанных вопросов^_^