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
缩略图gemaakt voor:124415main_image_feature_380a_ys_full.jpg
========= 1 60130main_image_feature_182_jwfull.jpg
缩略图gemaakt voor:60130main_image_feature_182_jwfull.jpg
========= 2assetImage.jpg
缩略图gemaakt voor:assetImage.jpg
========= 3 devcon-c1-image.gif
Fout:缩略图 kon niet gemaakt worden voor:devcon-c1-image.gif
========= 4 image-646313.jpg
缩略图gemaakt voor:image-646313.jpg
========= 5 图片-Schloss_Nymphenburg_Munich_CC.jpg
缩略图图像:Image-Schloss_Nymphenburg_Munich_CC.jpg
========= 6 image1w.jpg
缩略图gemaakt voor:image1w.jpg
========= 7 新%20Image.jpg
缩略图gemaakt voor:New%20Image.jpg
========= 8 samsung-gx20-image.jpg
缩略图gemaakt voor:samsung-gx20-image.jpg
========= 9 三星图片.jpg
缩略图gemaakt voor:samsung-image.jpg
========= 0 124415main_image_feature_380a_ys_full.jpg
缩略图gemaakt voor:124415main_image_feature_380a_ys_full.jpg
========= 1 60130main_image_feature_182_jwfull.jpg
缩略图gemaakt voor:60130main_image_feature_182_jwfull.jpg
========= 2assetImage.jpg
缩略图gemaakt voor:assetImage.jpg
========= 3 devcon-c1-image.gif
Fout:缩略图 kon niet gemaakt worden voor:devcon-c1-image.gif
========= 4 image-646313.jpg
缩略图gemaakt voor:image-646313.jpg
========= 5 图片-Schloss_Nymphenburg_Munich_CC.jpg
缩略图图像:Image-Schloss_Nymphenburg_Munich_CC.jpg
========= 6 image1w.jpg
缩略图gemaakt voor:image1w.jpg
========= 7 新%20Image.jpg
缩略图gemaakt voor:New%20Image.jpg
========= 8 samsung-gx20-image.jpg
缩略图gemaakt voor:samsung-gx20-image.jpg
========= 9 三星图片.jpg
缩略图gemaakt voor:samsung-image.jpg

虽然它应该是:

========= 0 124415main_image_feature_380a_ys_full.jpg
缩略图gemaakt voor:124415main_image_feature_380a_ys_full.jpg
========= 1 60130main_image_feature_182_jwfull.jpg
缩略图gemaakt voor:60130main_image_feature_182_jwfull.jpg
========= 2assetImage.jpg
缩略图gemaakt voor:assetImage.jpg
========= 3 devcon-c1-image.gif
Fout:缩略图 kon niet gemaakt worden voor:devcon-c1-image.gif
========= 4 image-646313.jpg
缩略图gemaakt voor:image-646313.jpg
========= 5 图片-Schloss_Nymphenburg_Munich_CC.jpg
缩略图图像:Image-Schloss_Nymphenburg_Munich_CC.jpg
========= 6 image1w.jpg
缩略图gemaakt voor:image1w.jpg
========= 7 新%20Image.jpg
缩略图gemaakt voor:New%20Image.jpg
========= 8 samsung-gx20-image.jpg
缩略图gemaakt voor:samsung-gx20-image.jpg
========= 9 三星图片.jpg
缩略图gemaakt voor:samsung-image.jpg

如您所见,生成器函数两次返回列表(我验证了它,它只被调用一次)。

@heikogerlach:os.walk 找不到缩略图,因为我正在遍历当前目录的文件名,并且缩略图被写入当前目录的名为“thumb”的子文件夹中。该列表是在将缩略图写入“thumb”目录之前生成的,我验证(使用 WinPDB)缩略图不包含在列表中。

@S.Lott:感谢您的建议。os.path.join 解决了这个问题。

4

2 回答 2

3

在您的调试中,打印完整路径。我认为您在浏览thumbs目录后正在浏览子目录.

还。

class ThumbnailGenerator( object ):

从长远来看,通常效果更好。

请不要__在您的方法名称前使用(generate_image_list 和 create_thumbnail_dir)。

不要"%s%s%s" % (self.image_path, os.sep, thumb_path)用来制作路径名,请使用os.path.join.

于 2009-04-17T14:51:34.357 回答
0

您的缩略图位于原始图像的子目录中,self.image_path并且与原始图像具有相同的名称。您可以检查 walk 是否在创建缩略图时找到它们?只需打印图像的路径和名称即可。

于 2009-04-17T14:46:26.337 回答