以特定顺序将图像加载到列表中

Load images into list in a specific order

我有一个包含遵循此命名方案的图像的文件夹:

FEATURED_0.png

FEATURED_1.png

FEATURED_2.png

当我想将它们加载到 Pillow 可用的列表中时,我会这样做:

for filename in glob.glob("FEATURED*.png"):
    image = Image.open(filename)
    featured_list.append(image)

这很好用,但有一个缺陷。它加载图像,不管它们的数量。 我已经尝试加载 FEATURED_0 无论如何,移动到列表中,然后检查下一个图像是否有更大的数字 +1,但失败得很惨。

回到我的问题。有没有办法将图像加载到 python 中的列表中,但按特定顺序?

glob 没有对文件名进行排序的选项。 os.list()os.walk()也无法排序。

为此你必须使用 list = sorted(list)

for filename in sorted(glob.glob("FEATURED*.png")):

但是没有参数的 sorted() 会将 _10 放在 _2 之前,因为它会在 char 之后检查 char 并且首先比较 __ 和下一个 12 并跳过休息。

您可能需要将 sorted(..., key=your_function)your_function 一起使用,后者从文件名中提取数字并转换为 integer - 而 sorted 将仅使用此 integer比较名称。

def number(filename):
    return int(filename[9:-4])

data = ['FEATURED_0.png', 'FEATURED_1.png', 'FEATURED_2.png', 'FEATURED_10.png']

print(list(sorted(data)))              # `_10` before `_2`
print(list(sorted(data, key=number)))  # `_2` before `_10`

结果

# `_10` before `_2`
['FEATURED_0.png', 'FEATURED_1.png', 'FEATURED_10.png', 'FEATURED_2.png']

# `_2` before `_10`
['FEATURED_0.png', 'FEATURED_1.png', 'FEATURED_2.png', 'FEATURED_10.png']

def number(filename):
    return int(filename[9:-4])

for filename in sorted(glob.glob("FEATURED*.png"), key=number):
    # ... code ...

你也可以写成lambda

sorted( data, key=(lambda x:int(x[9:-4])) )

您可以创建 returns 更复杂的功能 - 即。元组 (extension, number) - 然后首先得到所有 .jpg (按数字排序)然后是所有 .png (按数字排序)


编辑:

如果你有不同单词的文件名,但都具有结构 word_number.extension 那么你可以使用 split("_") 得到 wordsplit(".") 得到 numberextension。它可能需要使用元组 (word, int(number)) 首先按 word 排序,然后按 number

排序
def number(filename):
    word, rest = filename.split('_')
    number, ext = rest.split('.')
    return (word, int(number))

data = [
    'FEATURED_0.png', 'TEST_10.png', 
    'FEATURED_1.png', 'TEST_1.png', 
    'ANOTHER_10.png', 'FEATURED_2.png', 
    'ANOTHER_1.png', 'FEATURED_10.png',
]

print(list(sorted(data)))              # `_10` before `_2`
print(list(sorted(data, key=number)))  # `_2` before `_10`

如果您想从 0 开始,加载每个后续数字,并在您点击不存在的数字时停止,请使用 while 循环:

num = 0
base = "FEATURED_%d.png"
while os.path.isfile(base % num):
    featured_list.append(Image.open(base % num))
    num += 1