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

Python遍历目录生成字典程序故障:无法递归遍历子目录求助

解决递归遍历目录构建Pygame图像字典的问题

你的代码主要因为路径处理逻辑错误导致无法递归子目录,甚至读取不到目标文件,我帮你拆解问题并给出修正方案:

核心问题分析

  • 目录判断失效:os.path.isdir(item)里的item只是文件名/子目录名,Python会以当前工作目录为基准判断,而不是你传入的dir参数目录。必须拼接成完整路径后再判断。
  • 路径拼接语法错误:手动写的'\' if os.name == 'nt' else '/'有引号嵌套问题(单引号未转义),而且手动处理路径分隔符很容易出错,应该用Python内置的os.path.join()自动适配系统路径。
  • 后缀判断局限性:item[-4:]只能匹配4字符后缀(比如.png),遇到.jpeg这类5字符后缀就会失效,判断逻辑不够严谨。

修正后的完整代码

from pygame.image import load
import os

def gather_pics(dictionary, dir_path='.'):
    for item_name in os.listdir(dir_path):
        # 拼接完整路径,彻底解决相对路径问题
        full_item_path = os.path.join(dir_path, item_name)
        
        if os.path.isdir(full_item_path):
            # 为子目录初始化空字典,递归遍历
            dictionary[item_name] = {}
            gather_pics(dictionary[item_name], full_item_path)
        else:
            # 获取文件后缀并转小写,兼容更多格式和大小写
            file_ext = os.path.splitext(item_name)[1].lower()
            if file_ext in ('.png', '.jpg', '.jpeg'):
                # 提取无后缀文件名作为键
                file_key = os.path.splitext(item_name)[0]
                dictionary[file_key] = load(full_item_path)

if __name__ == '__main__':
    pic_collection = {}
    # 替换成你的目标目录,比如示例中的'pics'
    gather_pics(pic_collection, 'pics')
    print(pic_collection)

关键修改说明

  1. 统一使用完整路径:所有文件/目录操作都基于os.path.join拼接的完整路径,避免相对路径带来的判断错误,同时适配Windows和Linux/macOS的路径分隔符。
  2. 修正递归目录判断:用full_item_path判断是否为目录,确保基于传入的目标目录而非当前工作目录。
  3. 优化图片格式判断:通过os.path.splitext提取后缀,转小写后匹配,支持.jpeg等更多格式,同时兼容.PNG这类大写后缀的文件。
  4. 变量名规范化:把dir改为dir_path、dict改为pic_collection,避免和Python内置函数/类型重名,提升代码可读性。

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:42:39