Python实现OpenCV视频生成:JPG文件数字升序排序问题
我明白你的问题啦——os.listdir()默认是按字符串字典序排序的,这就是为什么img_10.jpg会排在img_2.jpg前面,因为字符串比较时'1'的ASCII码比'2'小。下面给你几个实用的解决方法:
方法1:提取文件名中的数字作为排序键
最直接的方式是从每个文件名里提取出数字部分,转换成整数后作为排序依据,这样就能实现数字升序了。
修改后的代码如下:
import os images = [] for f in os.listdir('.'): if f.endswith('.jpg'): images.append(f) # 提取文件名里的数字,按整数大小排序 images.sort(key=lambda x: int(x.split('_')[1].split('.')[0]))
简单解释:x.split('_')[1]会把img_0.jpg拆分为['img', '0.jpg'],取第二个元素后再用.split('.')[0]得到纯数字字符串,转成整数后就能按数字大小排序了。
方法2:使用natsort库(通用自然排序)
如果你的文件名格式可能有变化,或者不想自己写提取逻辑,推荐用第三方库natsort,它专门处理这种“自然排序”场景,适配各种带数字的文件名。
首先安装库:
pip install natsort
然后代码里这样用:
import os from natsort import natsorted # 筛选jpg文件并自然排序 images = natsorted([f for f in os.listdir('.') if f.endswith('.jpg')])
不管文件名里的数字位数多少,它都能正确按数字升序排列,非常省心。
方法3:用glob模块一步完成筛选+排序
glob模块可以直接匹配目标文件,再配合排序逻辑,一步到位:
import glob # 匹配所有jpg文件并按数字排序 images = sorted(glob.glob('*.jpg'), key=lambda x: int(x.split('_')[1].split('.')[0]))
glob.glob('*.jpg')会直接列出当前目录下所有jpg文件,后续的排序逻辑和方法1一致。
内容的提问来源于stack exchange,提问作者ddgg007
相关产品推荐
相关产品推荐

