Python利用数字命名规则读取目录指定范围图片的优化方法
优化实现方案
原代码存在两个明显问题:
- 多个并行
if判断会导致单张图片命中多个分支,出现重复读取图片、重复计数的逻辑bug - 依赖遍历顺序的计数逻辑不稳定,如果目录出现非预期文件会导致计数偏移,范围匹配错误
以下是两种不需要计数、直接利用文件名数字属性的优化方案:
方案1:基于文件名数字ID过滤(适合文件可能不连续的场景)
先提取所有jpg文件的数字ID,过滤掉超范围文件后再处理,不受目录内非目标文件影响:
import os import glob import cv2 from tqdm import tqdm img_dir = "/path/to/images" # 范围映射配置:(左闭区间, 右开区间, 输出目录),修改配置即可调整范围,不需要改业务逻辑 range_mapping = [ (0, 100, "/path/to/output/dir_1"), (100, 150, "/path/to/output/dir_2"), (150, 200, "/path/to/output/dir_3") ] # 预计算最大处理ID,提前过滤超范围文件 max_process_id = max([item[1] for item in range_mapping]) # 筛选合法的数字命名文件 valid_files = [] for file_path in glob.glob(os.path.join(img_dir, "*.jpg")): file_name = os.path.basename(file_path) name_no_suffix = os.path.splitext(file_name)[0] if name_no_suffix.isdigit(): img_id = int(name_no_suffix) if img_id < max_process_id: valid_files.append((img_id, file_path)) # 按数字ID排序,避免字符串排序导致的"10.jpg排在2.jpg前面"问题 valid_files.sort(key=lambda x: x[0]) # 处理图片 for img_id, img_path in tqdm(valid_files): for start, end, op_dir in range_mapping: if start <= img_id < end: img = cv2.imread(img_path, cv2.COLOR_BGR2RGB) # 此处写你的处理逻辑,结果存储到op_dir break
方案2:直接按ID范围拼接路径(适合文件连续命名的场景,性能最优)
不需要遍历整个目录的上万个文件,直接构造目标范围的文件路径,性能提升非常明显:
import os import cv2 from tqdm import tqdm img_dir = "/path/to/images" range_mapping = [ (0, 100, "/path/to/output/dir_1"), (100, 150, "/path/to/output/dir_2"), (150, 200, "/path/to/output/dir_3") ] for start, end, op_dir in range_mapping: for img_id in tqdm(range(start, end), desc=f"处理{start}-{end-1}区间"): img_path = os.path.join(img_dir, f"{img_id}.jpg") # 可选:加文件存在判断,避免缺失文件报错 if not os.path.exists(img_path): continue img = cv2.imread(img_path, cv2.COLOR_BGR2RGB) # 此处写你的处理逻辑,结果存储到op_dir
内容的提问来源于stack exchange,提问作者scribblepad
相关产品推荐
相关产品推荐

