遍历E:/Image子文件夹打开图片失败,报错‘list’ object has no attribute ‘read’
解决遍历文件夹及子文件夹显示图片的问题
首先看你的代码,存在几个明显的错误,导致无法正常打开图片:
错误分析
- 缺少glob模块导入:你使用了
glob.glob()但没有导入glob库,这会触发NameError(不过你当前报错是AttributeError,说明其他逻辑错误先触发了) - os.walk的使用错误:
os.walk(path)返回的是三元组(当前根目录, 子文件夹列表, 文件列表),你直接for file in r会遍历这个三元组的每个元素,先拿到路径字符串、再拿到文件夹列表、最后拿到文件列表,完全不符合遍历文件的需求 - 路径拼接逻辑混乱:
f'{root}{r}/{file}'这种写法完全错误,r是os.walk返回的三元组,不是路径片段,拼出来的路径根本无效 - glob与Image.open的适配错误:
glob.glob()返回的是匹配文件的列表,而Image.open()需要传入单个文件路径,直接传列表会触发类型错误
修正后的代码
这里给你两种可靠的实现方式,任选其一即可:
方式一:用os.walk直接遍历文件
import os from PIL import Image root = "E:/Image/" # 遍历所有子目录和文件,忽略子文件夹列表用下划线占位 for current_dir, _, files in os.walk(root): for file_name in files: # 只处理常见图片格式,避免非图片文件报错 if file_name.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')): file_path = os.path.join(current_dir, file_name) try: img = Image.open(file_path) img.show() except Exception as e: print(f"无法打开文件 {file_path}: {e}")
方式二:用glob递归匹配图片文件
import glob import os from PIL import Image root = "E:/Image/" # 递归匹配所有子文件夹里的常见图片文件 image_paths = glob.glob(os.path.join(root, "**", "*.[pPjJ][nNgGiIfF]*"), recursive=True) for path in image_paths: try: img = Image.open(path) img.show() except Exception as e: print(f"无法打开文件 {path}: {e}")
代码说明
- 两种方式都加入了图片格式过滤,避免尝试打开非图片文件导致的报错
- 加入
try-except捕获异常,即使某个文件损坏或无法打开,程序也能继续运行 - 用
os.path.join()做路径拼接,这是跨平台的标准写法,避免手动拼接路径出现分隔符错误
内容的提问来源于stack exchange,提问作者user2324278
相关产品推荐
相关产品推荐

