游戏媒体文件整理:如何让Python生成预期嵌套字典结构?
修复游戏媒体文件目录结构整理代码
需求与问题
我正在开发一款游戏,希望将图片和声音文件整理为指定结构的字典,预期格式如下:
Media = {"Images": {"Backgrounds": ['EarthGround.png', 'MarsGround.png', ...], "Sprites": [...]}, "Sounds": ["click.wav", ...]}
文件夹格式示意图:
我编写了如下代码:
Media = {} def sortFiles(directory): for x in os.listdir(directory): if os.path.isdir(f'{directory}/{x}'): Media[x] = sortFiles(f'{directory}/{x}') elif os.path.isfile(f'{directory}/{x}'): return [file for file in os.listdir(directory) if os.path.isfile(f'{directory}/{file}')] sortFiles("Media") print(Media)
运行后输出为:
{'Backgrounds': ['EarthGround.png', 'MarsGround.png'], 'Buttons': None, 'Icons': ['selectionBar.png'], 'Main': ['base.png'], 'Planets': None, 'Sprites': None}
可以看到,Backgrounds和Sprites并未如预期嵌套在Images键下,需要修复。
问题根源
代码直接操作全局的Media字典,遍历Media目录下的Images子文件夹时,没有将Images作为键来嵌套它的子目录和文件,反而直接把Images内的子目录(如Backgrounds)放到了Media根字典中。此外,遇到空文件夹时函数返回None,不符合预期格式。
修复后的代码
import os def sort_files(directory): result = {} for item in os.listdir(directory): item_path = os.path.join(directory, item) if os.path.isdir(item_path): # 递归处理子目录,获取子目录的结构 child_content = sort_files(item_path) # 空文件夹赋值为空列表,而非None result[item] = child_content if child_content else [] elif os.path.isfile(item_path): # 初始化文件列表并添加当前文件 if 'files' not in result: result['files'] = [] result['files'].append(item) # 当前目录只有文件时,直接返回文件列表 if 'files' in result and len(result) == 1: return result['files'] # 当前目录只有子目录时,返回子目录组成的字典 elif 'files' not in result: return result # 同时存在子目录和文件的情况(按需保留结构) return result # 生成目标结构的Media字典 Media = sort_files("Media") print(Media)
关键修复点
- 不再依赖全局字典,改为递归函数返回当前目录的结构,自然实现层级嵌套。
- 使用
os.path.join拼接路径,适配不同操作系统,避免路径错误。 - 空文件夹处理为空列表
[],替代原来的None,符合预期格式。 - 自动区分“仅文件目录”和“包含子目录的目录”,分别返回列表或嵌套字典,完美匹配需求结构。
内容的提问来源于stack exchange,提问作者Lyric Crayon
相关产品推荐
相关产品推荐

