如何对含数字的视频帧文件列表进行正确排序?
按文件名中的数字对视频帧文件列表正确排序
问题说明
我有一个存放视频帧的文件夹,需要按顺序读取其中的文件,但默认排序方法得到的结果不符合数字顺序:
data_dir = './data/' filenames = listdir(data_dir) N = len(filenames) filenames.sort() filenames # 输出结果 ['Image1.jpg', 'Image10.jpg', 'Image11.jpg', 'Image12.jpg', 'Image13.jpg', 'Image14.jpg', 'Image15.jpg', 'Image2.jpg', 'Image3.jpg', 'Image4.jpg', 'Image5.jpg', 'Image6.jpg', 'Image7.jpg', 'Image8.jpg', 'Image9.jpg']
解决方法
方法1:自定义固定格式的数字提取
针对固定格式的文件名(如示例中的ImageX.jpg),可以通过字符串分割提取数字,作为排序键:
import os data_dir = './data/' filenames = os.listdir(data_dir) def get_frame_number(filename): # 从文件名中提取数字部分并转为整数 return int(filename.replace('Image', '').replace('.jpg', '')) filenames.sort(key=get_frame_number) print(filenames)
方法2:正则表达式通用数字提取
如果文件名格式不固定,用正则表达式匹配文件名中的数字,兼容性更强:
import os import re data_dir = './data/' filenames = os.listdir(data_dir) def extract_num(filename): # 匹配文件名中的第一个连续数字序列 num_match = re.search(r'\d+', filename) return int(num_match.group()) if num_match else 0 filenames.sort(key=extract_num) print(filenames)
方法3:使用natsort库实现自然排序
借助第三方库natsort直接实现自然排序,无需手动提取数字:
import os from natsort import natsorted data_dir = './data/' filenames = os.listdir(data_dir) filenames = natsorted(filenames) print(filenames)
使用前需安装库:pip install natsort
内容的提问来源于stack exchange,提问作者S.EB
相关产品推荐
相关产品推荐

