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

Python删除JSON文件首条目未生效反而异常追加内容的问题

错误原因

你的代码有两处核心逻辑错误:

  1. list.pop()的返回值理解错了
    列表调用pop(0)会直接修改原列表、删除索引为0的元素,方法的返回值是被删掉的那个元素,不是删除后的剩余列表。你把返回值赋给newdata,拿到的其实是你要删掉的第一条{"gyfedz": ["gyfedz.jpg", "A short story"]},而你真正需要写回文件的、删完第一条的剩余列表,是执行完pop(0)之后的原变量data。
  2. 文件指针和截断逻辑错了
    你用*r+*模式打开文件,执行json.load(file)读完所有内容后,文件指针会停在文件末尾位置。这时候不带参数调用truncate(),会默认从当前指针位置(也就是文件末尾)开始截断,相当于完全没清空原有内容。之后执行json.dump()就会直接在原有完整内容的末尾,追加写入你拿到的那个被删除的条目,最终就出现了旧内容全保留、末尾多了一段异常内容的现象。
推荐新手使用的实现写法

对文件操作不熟练的阶段,优先把「读文件」和「写文件」拆成两个独立步骤,不用硬凑*r+*同开读写的模式,能避开90%的文件指针坑:

import json

def delete_first_entry():
    # 读取原始JSON内容
    with open("dictionary.json", "r", encoding="utf-8") as f:
        data = json.load(f)
    
    # 先判断列表非空再删,避免空列表pop报错
    if data:
        data.pop(0)
    
    # 用w模式打开文件会自动清空原有内容,直接写入处理后的数据即可
    with open("dictionary.json", "w", encoding="utf-8") as f:
        # indent参数用来格式化输出JSON,可读性更好;ensure_ascii=False避免中文被转义
        json.dump(data, f, indent=2, ensure_ascii=False)

这个写法逻辑直白,不需要记忆文件指针偏移、截断位置这类容易出错的细节,加的边界判断和格式化参数也能覆盖大部分日常使用场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:19:51