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

