Python循环中处理图片写入文件仅首次生效的问题求助
问题修复方案
问题根源
你的代码存在两个核心问题导致无法写入全部数据:
- 目录判断逻辑错误:图片处理的循环逻辑完全嵌套在
if not os.path.exists(output_dir):代码块内,这意味着只有当输出目录不存在时才会执行处理。一旦目录创建完成(第一次运行后),后续所有循环都不会触发。 - 文件写入模式错误:每次检测到人脸时用
open(l_out, 'w+')打开输出文件,w+模式会清空文件原有内容再写入,即使多次触发写入,最终也只会保留最后一次的内容(你反馈仅第一次写入,大概率是后续循环因目录已存在根本没执行)。 - 重复IO操作:每次检测到人脸都重新读取整个标签文件,效率极低且没必要。
修复后的代码
def process_images(base_file, output_dir, labels_path, l_out, sample_size): # 确保输出目录存在,无论是否已存在都继续后续逻辑 os.makedirs(output_dir, exist_ok=True) # 提前读取标签文件并缓存为字典,避免重复IO label_map = {} with open(labels_path, 'r') as d: # 跳过第一行,构建文件名到对应行的映射 for line in d.readlines()[1:]: file_name = line.split('/')[0].split()[1] label_map[file_name] = line list_ims = sorted(os.listdir(base_file)) # 先清空输出文件,再循环写入(如需保留历史内容可改用'a'追加模式) with open(l_out, 'w') as f_out: for counter, img in enumerate(list_ims): if counter > sample_size: print('Reached the end of the sample size') break print('processing image number {} with name {}'.format(counter, img)) im = cv.imread(os.path.join(base_file, img)) output_path = os.path.join(output_dir, img) result = face_detector(counter, im, output_path) if result and img in label_map: f_out.write(label_map[img])
关键修复说明
- 目录处理优化:使用
os.makedirs(output_dir, exist_ok=True)替代原判断逻辑,确保目录存在的同时,后续处理逻辑不受目录是否新建的影响,每次运行都会执行循环。 - 写入模式调整:将输出文件的打开操作移到循环外,用
w模式先清空文件(需保留历史则用a),循环内直接写入,避免每次打开都清空内容。 - 标签文件缓存:提前一次性读取标签文件并构建映射字典,循环内直接查找写入,大幅提升效率。
- 逻辑简化:移除冗余的
else分支,代码更简洁易读。
内容的提问来源于stack exchange,提问作者Aayush Jain
相关产品推荐
相关产品推荐

