You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:26:28