Python 3.9中重复调用json.load读取同一文件对象触发JSONDecodeError的原因咨询
为什么连续调用
json.load()读取同一个文件对象会触发JSONDecodeError? 兄弟,这个坑我之前也踩过!问题根本不是JSON的锅,是文件对象的读取指针位置在搞事情~
错误原因详解
当你第一次调用json.load(read_file)时,它会一次性把文件里的所有JSON内容读完,这时候文件内部的读取指针会直接跳到文件末尾。等你第二次再调用json.load(read_file),程序会从当前指针位置(也就是空无一物的文件末尾)尝试读取数据——啥都读不到,自然就抛出JSONDecodeError,提示"Expecting value"了。
你看,第一个函数只调用一次json.load,读完就结束,完全没问题;第二个函数第二次调用时,指针已经在末尾,没有有效JSON数据可以解析,所以直接报错。
几种解决方案
根据你的需求,这里有几个实用的解决办法:
1. 重置文件指针到开头
读完第一次后,用seek(0)把指针拉回文件起始位置,再读第二次:
import os import json def scores2(filedir): for filename in os.listdir(filedir): with open(os.path.join(filedir, filename), 'r') as read_file: data = json.load(read_file) read_file.seek(0) # 将指针重置到文件开头 dataextra = json.load(read_file)
2. 先把文件内容读入内存,再多次解析
更高效的方式是一次性把文件内容读到字符串里,然后用json.loads()(注意是带s的版本,解析字符串)多次解析,避免重复操作文件:
import os import json def scores2(filedir): for filename in os.listdir(filedir): with open(os.path.join(filedir, filename), 'r') as read_file: file_content = read_file.read() # 一次性读取所有内容到内存 data = json.loads(file_content) dataextra = json.loads(file_content)
3. 直接复制Python对象(最省事)
如果你的需求只是得到一份和data一样的变量,完全没必要重复解析JSON,直接复制对象就行:
import os import json import copy # 嵌套结构需要深拷贝时用 def scores2(filedir): for filename in os.listdir(filedir): with open(os.path.join(filedir, filename), 'r') as read_file: data = json.load(read_file) # 浅拷贝:适合非嵌套的简单结构 dataextra = data.copy() # 深拷贝:如果是嵌套字典/列表,用这个 # dataextra = copy.deepcopy(data)
内容的提问来源于stack exchange,提问作者Max315
相关产品推荐
相关产品推荐

