按顺序读写多文件:图片处理排序异常的解决方法求助
解决图片读取顺序不符的问题
问题根源是glob.glob()返回的文件列表采用操作系统默认的字典序排序,对带数字后缀的文件名(如results25_00001.png、results25_000010.png)会出现排序错误(00010会排在0002前面)。要保证按文件名中的数字递增顺序读取,需要对文件路径做自然排序,修改代码如下:
完整修改后的代码
import glob import os import cv2 path = '/Users/Desktop/FFMPEG/results25' # 获取所有png文件路径 image_paths = glob.glob("/Users/Desktop/FFMPEG/test25/*.png") # 自定义排序key:提取文件名中的数字部分转为整数 def get_frame_num(file_path): file_name = os.path.basename(file_path) # 从results25_00001.png中提取00001并转为整数 num_str = file_name.split('_')[1].split('.')[0] return int(num_str) # 按帧号从小到大排序 sorted_image_paths = sorted(image_paths, key=get_frame_num) # 提前读取文本文件,避免循环内重复IO操作 with open('FS_25FULL.txt') as f: lines = f.readlines() # 函数定义移到循环外,避免重复定义 def global_vector_cal(LIST_DATA): counter_vector = 0 # rest of your code # 遍历排序后的图片 for i, image in enumerate(sorted_image_paths, 1): img = cv2.imread(image) data_number = i # frame number and max is 918 # 注意:Python列表索引从0开始,若第1帧对应文本第3行(索引为2),需调整为n = data_number*3 -1 # 请根据实际文本行号确认此计算逻辑 n = data_number * 3 data = lines[n].split(")") list_data = [string.replace('(', '').replace(' ', '').split(",") for string in data] list_data.pop(-1) cv2.line(img, P_1, P_2, color=(0,255,255), thickness=2) cv2.line(img, P_1, P_3, color=(0,255,255), thickness=2) # 调用向量计算函数 global_vector_cal(list_data) cv2.imwrite(os.path.join(path, 'img_{}.png'.format(i)), img)
关键修改点
- 强制自然排序:通过
sorted()配合自定义get_frame_num函数,提取文件名中的数字作为排序依据,确保图片按00001→00002→...的顺序读取。 - IO优化:将文本文件的读取操作移到循环外,避免每次循环重复打开读取文件,提升运行效率。
- 函数定义优化:把
global_vector_cal函数移到循环外,避免每次循环重新定义函数。
额外注意事项
检查文本行索引是否正确:Python列表索引从0开始,若第1帧对应文本第3行(实际索引为2),则需将n = data_number*3改为n = data_number*3 -1,避免出现索引越界或取错行的问题。
内容的提问来源于stack exchange,提问作者bst
相关产品推荐
相关产品推荐

