Windows图片按名称排序的问题详解

当图片名称不仅有数字还有非数字字符(‘a’, ‘b’, ‘_’, ‘.’ 等)时,Windows中“按名称排序”其实并不是严格按照依次比较字符的ASCII码来排列的。

当非数字字符之前有数字时,名称排序时按照第一个非字符之前的数字数值大小来排序的。如图(我这里是“按名称升序排列”),观察前3张图片:
在这里插入图片描述
如果按照ASCII码排序(’_'是95,'0’是48),排序应为:10_0.jpg、1__1.jpg、2_.jpg,然而事实是按照1__1.jpg、2_.jpg、10_0.jpg的顺序排列的,这是因为下划线前的数值1<2<10,这里有Windows官方文档供参考。

【实例】:
这里是按顺序读取文件夹里的图片,三种方式作对比。
“roses”文件夹下图片部分截图:
(可以看出排序正如我之前所说,因为第4张首字为‘9’的ASCII码明显比第5张‘1’大)
在这里插入图片描述

“roses1”文件夹下部分图片截图:
在这里插入图片描述

方式一:

from PIL import Image
import os

img_list = os.listdir('C:\\Users\\XX\\Downloads\\roses1\\')
num = input("input your ID : ")  #ID为7位数字,后两位为所要展示的图片序号
order = int(num[-2:])-1   #如ID:81723052,则想要展示第52张,由于列表是按照0、1、2排序,则索引值减一
print("我想要显示第",order+1,"张图片")

print("排序前:", img_list)

img_list.sort(key=lambda x:int(x.split('_',)[0]),reverse=False) #"roses"里图片名是"12240303_80d87f77a3_n.jpg""22679076_bdb4c24401_m""99383371_37a5ac12a3_n"是按照下划线前的所有数字的数值大小来排序的
print("排序后:", img_list)

im = Image.open('C:\\Users\\XX\\Downloads\\roses1\\' + '\\' + img_list[order])
im.show()

运行结果:
在这里插入图片描述
显示图片:
在这里插入图片描述
分析:可以看出,显示的图片正是Windows按名称升序排序的第4张图片,这是因为代码中:

img_list.sort(key=lambda x:int(x.split('_',)[0]),reverse=False) 

将名称列表按下划线分割开,并将第一个列表元素(即“12240303”、“22679076”、“24781114”等)转化为int型进行sort。

方式二:

# 方法五
from PIL import Image
import os

img_list = os.listdir('C:\\Users\\XX\\Downloads\\roses1\\')
num = input("input your ID : ")  #ID为7位数字,后两位为所要展示的图片序号
order = int(num[-2:])-1   #如ID:81723052,则想要展示第52张,由于列表是按照0、1、2排序,则索引值减一
print("我想要显示第",order+1,"张图片")

print("排序前:", img_list)

img_list.sort(key=lambda x:int(x.split('.',)[0]),reverse=False) #"roses1"里当图片名为"1.jpg""11.jpg"时,把名称中.前的数字提取出来按数值排序
print("排序后:", img_list)

im = Image.open('C:\\Users\\XX\\Downloads\\roses1\\' + '\\' + img_list[order])
im.show()

运行结果:
在这里插入图片描述
显示图片:
在这里插入图片描述
从运行结果可以看出,排序前后图片顺序并不一样,排序前列表是“10.jpg”在第2张,排序后才是正常的从“1.jpg”、“2.jpg”、……,这是因为代码中:

img_list.sort(key=lambda x:int(x.split('.',)[0]),reverse=False) 

将“.”之前的字符,也就是只剩下的数字部分分割出来,并转化成int型进行排序,这样就是按数值大小进行排序了。

方式三:


from PIL import Image
import os

img_list = os.listdir('C:\\Users\\XX\\Downloads\\roses1\\')
num = input("input your ID : ")  #ID为7位数字,后两位为所要展示的图片序号
order = int(num[-2:])-1   #如ID:81723052,则想要展示第52张,由于列表是按照0、1、2排序,则索引值减一
print("我想要显示第",order+1,"张图片")

print("排序前:", img_list)

img_list.sort()  #如果不强制转化为int,则按字符串排序
print("排序后:", img_list)

im = Image.open('C:\\Users\\XX\\Downloads\\roses1\\' + '\\' + img_list[order])
im.show()

运行结果:
在这里插入图片描述
显示图片:
在这里插入图片描述
这次是单纯按照图片名称排序,可以看到就是按照字符的ASCII码进行排序的,因为“10.jpg”在“2.jpg”之前。其实这单纯只是sort()对字符串排序的用法,没什么神秘的。

总结:Windows按图片名称排序时,并不是单纯按照字符的ASCII码进行排序的,当出现数值时,是按照非字符之前的数值大小进行排序。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值