如何按正确顺序读取(排序)以时间命名的文件

做项目时碰到一个不容易注意到的问题,幸亏及时看出来了,不然项目做完才发现,怕是会酿成大错。。特此记录一下改正的过程,希望能够引以为戒。

项目细节就不赘述了,就简单讲一下遇到的这个问题:

文件命名

文件命名格式:年_月_日_时_分_秒_毫秒,是每隔200毫秒的文件命名,在Windows文件夹中按名称排序如下所示:

目的

按时间顺序读取这些文件,说白了就是要对这些文件按照时间顺序进行正确排序,用前三个文件为例,['2024_6_3_15_38_51_53.bmp','2024_6_3_15_38_51_262.bmp','2024_6_3_15_38_51_461.bmp'],先进行读取,然后输出排序后的列表。

root_dir=r'D:\6'
img_list = os.listdir(root_dir) #读取文件夹里的文件,生成列表
print(sorted(img_list))#输出排序后的结果

初看看不出什么不对,但仔细去看,前面时间都是相同的,看最后边的毫秒位,分别是262、461、53,正常理解应该是53、262、461,但用sorted()排序输出的结果却是262、461、53!!!

原因

Python的按文件名排序sorted()并没有考虑到整体,是一位数一位数进行排序的,5>4>2,所以排序的结果是262、461、53,但按人所认知的数字大小来应该是53、262、461。

解决方法

定义一个函数extract_numbers(),提取所有的数字部分,并将它们作为整数列表返回,这样就可以按整体的数字进行对比排序,而不是之前的sorted()按单一位数对比,所以在sorted()函数中以此为标准进行排序。

def extract_numbers(filename):
    base_name = filename.rsplit('.', 1)[0]  
    numbers = [int(part) for part in base_name.split('_') if part.isdigit()]
    return numbers

root_dir=r'D:\6'
img_list = os.listdir(root_dir)
print(sorted(img_list, key=extract_numbers))#输出排序结果

输出结果如上所示,可以看到这才是正常人所认知的排序结果,53、262、461。

总结

写代码时候还是得认真仔细,到处都是细节,任何一个地方的细节有问题,都会影响到后续的结果,幸好及时发现了问题,早发现问题还是比项目快做完了才发现好啊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值