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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:27:03