Python处理JSON配置时删除字典内嵌套列表中指定字典的问题
问题原因
你代码报错的核心原因是del index['trackers'][i]的写法不符合Python列表的操作规范:Python列表的索引只能是整数或者切片,而这里的i是遍历拿到的字典元素,不能作为下标使用,因此会抛出类型错误。
另外你的代码还存在逻辑顺序问题:删除配置、保存配置的逻辑被放在了遍历父文件夹内容的循环内部,会导致只删除父文件夹下第一个子文件/子目录就终止操作,剩余内容无法清理,配置也会提前写入。
修复方案
方案1:使用enumerate遍历获取索引删除(适合需要先处理配置关联资源的场景,匹配你的需求)
import shutil import os index = load_json("fs_data/index.json", "r") not_found = True # 同时遍历索引和元素,拿到合法的整数索引 for idx, item in enumerate(index['trackers']): if item['name'] == shell[1]: print(f"Found! {item}") not_found = False # 先清理对应目录下的所有内容 for f in os.listdir(item['parent_folder']): shutil.rmtree(os.path.join(item['parent_folder'], f)) # 清理完资源后再删除配置项 del index['trackers'][idx] # 最后保存配置 save_json("fs_data/index.json", index, "w", indent=2) break if not_found: print("未找到对应配置!")
方案2:列表推导式直接过滤(更简洁的写法)
如果不需要在删除前做复杂的资源处理,可以直接用列表推导式生成过滤后的新配置列表:
index = load_json("fs_data/index.json", "r") origin_len = len(index['trackers']) # 直接过滤掉name等于目标值的配置项 index['trackers'] = [item for item in index['trackers'] if item['name'] != shell[1]] if len(index['trackers']) == origin_len: print("未找到对应配置!") else: # 这里可补充资源清理逻辑 save_json("fs_data/index.json", index, "w", indent=2)
额外注意点
- 如果你要删除的是整个
parent_folder目录本身,不需要遍历目录内容,直接调用shutil.rmtree(item['parent_folder'])即可,避免子项是文件时shutil.rmtree报错的问题。 - 如果存在多个
name重复的配置项,列表推导式可以一次性全部删除,第一种方案去掉break也可以实现批量删除效果。
内容的提问来源于stack exchange,提问作者noone_interesting
相关产品推荐
相关产品推荐

