遍历子目录创建图像对元组时遇NameError问题求助
问题分析与解决:遍历子目录生成图片对时的NameError问题
你尝试遍历包含两张图片的子目录,将图片存入元组时遇到了NameError,错误信息如下:
Traceback (most recent call last):
File "create_pair.py", line 16, in
pair = (im1,im2)
NameError: name 'im1' is not defined
咱们来拆解问题根源,再给出修复方案:
原代码的问题所在
你的代码逻辑存在几个关键漏洞:
- 变量可能未被赋值:遍历文件时,只有遇到以'1'或'2'开头的文件才会给
im1/im2赋值。如果某个子目录里没有1.jpg,或者遍历顺序没触发对应的条件,im1就从未被定义,执行到创建元组的代码时就会报错。 - 遍历逻辑冗余且不精准:你已经明确要找的是
1.jpg和2.jpg,没必要逐个文件判断前缀;同时os.walk会遍历根目录本身,如果根目录下没有这两张图,也会触发错误。 - 路径拼接不规范:手动用
root + '/' + '1.jpg'拼接路径,在Windows系统下会出错,也容易因为遗漏分隔符导致路径错误。
修正后的代码
我们换个更可靠的思路:针对每个目录,直接检查目标文件是否存在,确认存在后再读取图片,这样能彻底避免变量未定义的问题:
import os import cv2 path = '/Users/abc/Desktop/images' pairs = [] # 遍历所有层级的目录 for root, dirs, files in os.walk(path): # 用os.path.join规范拼接路径,避免跨平台问题 img1_path = os.path.join(root, '1.jpg') img2_path = os.path.join(root, '2.jpg') # 先确认两张图片都存在 if os.path.exists(img1_path) and os.path.exists(img2_path): im1 = cv2.imread(img1_path) im2 = cv2.imread(img2_path) # 额外判断图片是否读取成功(文件损坏时cv2.imread会返回None) if im1 is not None and im2 is not None: pairs.append((im1, im2))
核心优化说明
- 规范路径处理:用
os.path.join替代手动拼接,适配不同操作系统的路径规则。 - 前置存在性检查:确保要读取的文件确实存在,从根源避免变量未定义的错误。
- 增加有效性校验:过滤掉损坏的图片(
cv2.imread返回None的情况),保证pairs里的都是有效的图片对。
内容的提问来源于stack exchange,提问作者Simplicity
相关产品推荐
相关产品推荐

