Python中如何排除已处理的.jpg文件,避免重复执行
我完全懂这种大规模任务中断后不想从头跑的痛苦!43小时的耗时真的耗不起,给你几个实用的方案,精准筛选出未处理的JPG文件:
核心思路
因为input和processed的子文件夹结构不对应,所以不能按路径匹配,核心是对比文件名(不含后缀):
- 先收集
processed文件夹下所有已生成的.npy文件的文件名(去掉.npy后缀) - 遍历
input下所有.jpg文件,筛选出文件名不在已完成列表里的文件
这种方式不管子文件夹结构如何,只看文件名本身,完全适配你的场景。
Python实现(推荐,适合集成到你的预处理脚本)
用Python的pathlib库(现代、简洁)来实现,代码可以直接嵌入到你的现有脚本开头:
from pathlib import Path # 替换成你的实际文件夹路径 INPUT_DIR = Path("input") PROCESSED_DIR = Path("processed") # 第一步:收集所有已完成的文件名(不含后缀),用集合存,查找速度极快 completed_filenames = set() for npy_path in PROCESSED_DIR.rglob("*.npy"): # 跳过空文件或损坏的文件(可选但推荐) if npy_path.stat().st_size > 0: completed_filenames.add(npy_path.stem) # 第二步:筛选未处理的JPG文件 unprocessed_files = [] for jpg_path in INPUT_DIR.rglob("*.jpg"): if jpg_path.stem not in completed_filenames: unprocessed_files.append(jpg_path) # 输出结果,或者直接传入你的处理函数 print(f"共找到 {len(unprocessed_files)} 个未处理的JPG文件") # 比如:for file in unprocessed_files: your_processing_function(file)
为什么用集合?
集合的成员查找是O(1)时间复杂度,对比列表的O(n),当文件数量成千上万时,速度差异会非常明显,避免额外的耗时。
Shell脚本实现(适合快速批量操作)
如果你不想改Python脚本,用Shell命令也能快速得到未处理的文件列表:
# 1. 生成input下所有JPG的文件名(不含路径和后缀)并排序 find input -name "*.jpg" -exec basename {} .jpg \; | sort > input_jpgs.txt # 2. 生成processed下所有NPY的文件名(不含路径和后缀)并排序 find processed -name "*.npy" -exec basename {} .npy \; | sort > processed_npys.txt # 3. 找出input有但processed没有的文件名 comm -23 input_jpgs.txt processed_npys.txt > unprocessed_names.txt # 4. (可选)找到这些文件名对应的实际JPG文件路径 echo "未处理的文件路径:" for name in $(cat unprocessed_names.txt); do find input -name "${name}.jpg" done
额外优化建议
- 检查文件完整性:如果脚本中断时可能生成空的
.npy文件,一定要加上文件大小检查(Python示例里的st_size > 0),避免跳过实际未完成的任务 - 处理重名文件:如果
input下不同子文件夹有同名的.jpg,对应的.npy会覆盖,这种情况建议把相对路径作为标识(比如用jpg_path.relative_to(INPUT_DIR).with_suffix('')代替jpg_path.stem),确保每个文件唯一对应
内容的提问来源于stack exchange,提问作者Maks Piddubnyi
相关产品推荐
相关产品推荐

