按需保存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
相关产品推荐
相关产品推荐

