按顺序组织列表中的元素

我正在加载 700 张图像,我需要它们按照名称的顺序排列(_DCS6825_01、_DCS6825_02...),但是当尝试这样做时,在图像 _DCS6825_10 之后,下一个要加载的是图像 _DCS6825_100,然后是 _DCS6825_101图片 11(_DCS6825_11),我该如何解决。这是我的代码:


from PIL import Image

import glob

import matplotlib.pyplot as plt

import os


path = r'C:\Users\juanc\Desktop\prueba origen\restich\\'

image_list = []

for filename in glob.glob(path+'*.jpg'):

    im=Image.open(filename)

    image_list.append(im)

sortedlist = sorted(image_list)

print(sortedlist)

排序产生错误:


TypeError: '<' not supported between instances of 'JpegImageFile' and 'JpegImageFile'

谢谢您的帮助


忽然笑
浏览 154回答 1
1回答

幕布斯7119047

你在这里有两个问题:首先是您试图自己对图像进行排序,而不是使用它们的文件名。正如评论中所指出的,您应该首先对列表进行排序,然后加载图像:path = r'...'image_list = glob.glob(path + '*.jpg')sortedlist = sorted(image_list)loaded_images = []for filename in image_list:&nbsp; &nbsp; im = Image.open(filename)&nbsp; &nbsp; loaded_images.append(im)第二个是当您对列表进行排序时,sorted使用文件名,从而使用字母顺序,而不是像您想要的那样使用文件名的最后一个数字进行排序。我建议在这里使用自定义键对列表进行不同的排序。假设文件名始终遵循相同的模式_DSC<number1>_<number2>.<ext>,您希望根据 对文件进行排序number2,您可以使用:sortedlist = sorted(&nbsp; &nbsp; &nbsp; &nbsp; image_list,&nbsp; &nbsp; &nbsp; &nbsp; key=lambda filename: int(filename.split('_')[-1].split('.')[0])&nbsp; &nbsp; )此处的 lambda 将针对它获取的每个元素(在本例中为文件名)拆分_为最后一个元素,因此在本例中为最后一个数字,不带扩展名(因此为.split('.')[0])并将其转换为 int 以删除过多的开头的零能够正确排序。请注意,只有当所有文件名都遵循相同的模式时,这才有效,否则,您可能会遇到其他问题。希望这可以帮助!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python