Функция генератора выполняется дважды? - PullRequest
1 голос
/ 17 апреля 2009

Я использую функцию генератора 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 не может найти миниатюры, так как я просматриваю имена файлов текущего каталога, и миниатюры записываются в подпапку текущего каталога с именем «thumb». Список создается перед записью миниатюр в каталог «thumb», и я проверил (используя WinPDB), что миниатюры не включены в список.

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

Ответы [ 2 ]

3 голосов
/ 17 апреля 2009

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

Также.

class ThumbnailGenerator( object ):

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

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

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

0 голосов
/ 17 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...