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

按需保存Python列表至JSON文件时出现JSONDecodeError问题求助

问题分析与解决方案

首先,你遇到的JSONDecodeError: Extra data错误,根源在于文件写入时没有截断原有内容,导致旧文件中未被覆盖的残留数据留在了JSON末尾,破坏了JSON的结构(比如你看到的955]})。

为什么会出现这个问题?

你的代码中使用了r+模式打开文件,执行seek(0)后写入新的JSON数据,但如果新生成的JSON字符串长度短于原文件内容的长度,原文件中后面的部分不会被自动删除,就会变成“垃圾数据”附加在新JSON后面,导致解析时认为有多个顶层JSON对象,触发错误。

另外,你的代码存在冗余的文件操作:两次打开同一个文件,其实可以合并成一次完成读取、修改、写入的全流程。

修正后的代码

下面是优化后的版本,解决了上述问题:

import os
import json

def listsToFile(listName, listToSave):
    data = {}
    # 尝试读取现有文件,不存在则创建空字典
    try:
        with open('data.json', 'r') as readFile:
            data = json.load(readFile)
    except FileNotFoundError:
        # 文件不存在时,初始化为空字典
        pass
    
    # 更新数据
    data[listName] = listToSave
    
    # 写入文件,使用'w'模式会自动创建/覆盖文件,避免残留问题
    with open('data.json', 'w') as outputToFile:
        json.dump(data, outputToFile)

关键改进点

  • 简化文件操作:用try-except处理文件不存在的情况,无需提前判断文件是否存在,代码更简洁。
  • 使用w模式写入:w模式会直接覆盖整个文件,彻底避免旧内容残留的问题,比r+模式更安全可靠。
  • 减少IO操作:合并读取和写入的流程,减少文件打开/关闭的次数,提升效率。

额外优化建议

如果需要让JSON文件更易读,可以在json.dump中添加indent参数:

json.dump(data, outputToFile, indent=4)

这样生成的JSON会有缩进,方便调试查看。

验证效果

现在无论文件是否存在,或者已有数据,每次调用listsToFile都会正确覆盖整个文件,写入完整的JSON结构,不会再出现末尾的垃圾数据,也就不会触发JSON解析错误了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 13:13:14