以特定顺序将图像加载到列表中
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 并且首先比较 _
与 _
和下一个 1
与 2
并跳过休息。
您可能需要将 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("_")
得到 word
和 split(".")
得到 number
和 extension
。它可能需要使用元组 (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
我有一个包含遵循此命名方案的图像的文件夹:
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 并且首先比较 _
与 _
和下一个 1
与 2
并跳过休息。
您可能需要将 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("_")
得到 word
和 split(".")
得到 number
和 extension
。它可能需要使用元组 (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