PIL图像以错误的顺序保存(for循环,枚举索引)

时间:2017-09-25 00:42:45

标签: python for-loop io save python-imaging-library

我正在编写一个程序,对于目录中的所有文件(101个文件已按顺序命名为0.jpg到100.jpg)打开文件,根据比例调整大小,然后根据枚举的for循环索引将输出保存在不同的目录中。我很困惑为什么我的索引和文件名没有匹配。 for循环的索引从0到100运行,文件名也是如此。 for循环应按顺序从0到100调用源图像文件,并因索引而按顺序保存它们。

但是,当我运行程序时,源图像100(应该是最大的已调整大小的图像)现在保存为3.jpg并且是第四个最小的图像。什么是图像3现在是图像24.可能由此产生更多变化。但是,在较大的图像中,顺序是正确的。

这是我的代码:

"seeders-path": process.env.NODE_ENV === 'development'? 
  "seeders/development" :
  "seeders/production"

我甚至确保对文件进行排序。比率和索引都正确打印。这里发生了什么?

1 个答案:

答案 0 :(得分:1)

os.listdir可能无法返回正确排序的图书。您应该在迭代之前对数组进行排序。更好的方法是使用原始文件名而不是迭代器。
您可以尝试使用array.sort()函数的以下代码。

try:
    files = os.listdir(os.path.join(os.getcwd(),"source images"))
    files.sort()
except IOError:
    print('No folder found.')
    input('Enter any key to exit: ')
    exit()

2017年2月26日更新
我已在计算机中测试了您的代码。我发现我在sort()犯了一个错误。
这是控制台在整个迭代过程中打印参数。

file = 0.png
index = 0

file = 1.png
index = 1

file = 10.png
index = 2

file = 11.png
index = 3

file = 12.png
index = 4

file = 13.png
index = 5

file = 14.png
index = 6

file = 2.png
index = 7

file = 3.png
index = 8

sort()函数的问题是函数总是按字符比较字符串。因此,结果将与索引不匹配。
我对你的代码做了一些改动。它在我的计算机中工作以产生预期的结果。

for index, file in enumerate(files):
    path = os.path.join(os.getcwd(), "source images", file)
    img = Image.open(path)
    # do your operation 
    # Use the file name itself instead of the index
    img.save("resized images/"+ file, 'JPEG')