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

如何在Python中按键删除JSON文件数组中的元素及代码问题修复

问题分析与修复方案

嘿,我来帮你搞定这个问题!你遇到了两个核心问题:文件写入后残留旧内容,以及遍历列表删除元素的潜在隐患,咱们一步步拆解解决:

1. 文件末尾残留旧内容的原因

你用r+模式打开文件,seek(0)只是把文件指针移到开头,但写入新内容时,只会覆盖开头部分。如果新内容的长度比原文件短,原文件里没被覆盖的后半段就会留在文件里,这就是你看到末尾多出来{ "name": "!@#", "infotext": "!@#$" } ] }的根本原因。

2. 遍历列表时直接删除元素的坑

虽然这次你刚好删掉了目标元素,但这种写法有隐患:当你在遍历列表的同时删除元素,列表的索引会发生变化,如果有多个匹配项,很可能会跳过某个元素(比如删除第i个元素后,下一个元素移到i位,但循环会直接走到i+1,就漏了这个元素)。


修复后的完整代码

import json

def delete_data():
    name = input("Enter data name\n")
    # 先读取文件里的所有数据
    with open("info.json", "r") as f:
        file_data = json.load(f)
    
    # 用列表推导式过滤掉要删除的元素,安全又简洁
    file_data["data"] = [item for item in file_data["data"] if item["name"] != name]
    
    # 用w模式打开文件——这个模式会直接清空原有内容,再写入新数据
    with open("info.json", "w") as f:
        json.dump(file_data, f, indent=4)

delete_data()

修复说明

  • 拆分读写操作:先读再写,用w模式代替r+,彻底避免旧内容残留的问题,因为w模式打开文件时会直接清空所有原有内容。
  • 列表推导式过滤:相比遍历删除,这种方式直接生成一个不包含目标元素的新列表,不会出现遍历遗漏的问题,代码也更简洁易懂。

测试一下,输入!@#后,你的info.json就会变成预期的样子:

{
    "dates": [
        {
            "date": "10/10",
            "desc": "test1"
        },
        {
            "date": "09/09",
            "desc": "test3"
        }
    ],
    "data": [
        {
            "name": "123",
            "infotext": "1234"
        }
    ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 12:42:37