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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:48:50