读取文本文件中图片路径时触发AttributeError问题求助
问题排查与修复方案
从你的代码和报错情况来看,最可能的原因是读取的图片路径包含换行符,导致cv2.imread返回None,后续对这个None对象操作时触发了AttributeError。下面详细拆解问题并给出修复方案:
核心问题点
f.readlines()会保留每行末尾的换行符\n,比如你的文件里写的是D:\xxx\img.jpg,读出来的image_path实际是D:\xxx\img.jpg\n,这种无效路径会让cv2.imread返回None- 你后续对
image(此时是None)执行操作(比如旋转90度的代码被截断了),自然会触发AttributeError,因为None没有对应的属性/方法 - 另外代码里创建输出目录时用了相对路径
images_90t,但你定义了path_out变量,这里路径不统一,可能导致目录创建到错误位置
修复后的完整代码
import os import cv2 PATH_IN = 'D:\\user\\data\\Augmentation' path_out = 'D:\\user\\data\\Augmentation\\images_90t' # 统一用绝对路径创建输出目录 try: if not os.path.exists(path_out): os.makedirs(path_out) except OSError as e: print(f'Error: Creating directory of data - {e}') # 读取文件列表并处理图片 with open('filelist.txt', 'r') as f: for image_path in f.readlines(): # 去掉换行符和前后空白字符 image_path = image_path.strip() # 跳过空行 if not image_path: continue # 验证路径是否存在 if not os.path.exists(image_path): print(f'Warning: Path does not exist - {image_path}') continue # 读取图片 image = cv2.imread(image_path, 1) # 检查是否读取成功 if image is None: print(f'Warning: Failed to read image - {image_path}') continue # 这里补充你原本要执行的操作(比如旋转90度) # 示例:顺时针旋转90度 rotated_image = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE) # 生成输出路径(假设用原文件名保存) filename = os.path.basename(image_path) output_path = os.path.join(path_out, filename) # 保存图片 cv2.imwrite(output_path, rotated_image) print(f'Processed and saved: {output_path}')
关键修复说明
- 清理路径字符:用
image_path.strip()移除每行的换行符、空格等空白字符,确保路径有效 - 路径有效性校验:增加
os.path.exists检查,提前过滤无效路径并给出提示 - 检查读取结果:判断
image是否为None,避免对空对象执行操作 - 统一输出路径:直接使用定义好的
path_out变量创建目录和保存图片,避免路径混乱
内容的提问来源于stack exchange,提问作者bit_scientist
相关产品推荐
相关产品推荐

