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

Python终端可加载JSON文件 脚本运行及ujson加载均报错

问题原因与修复方案

核心问题1:回退逻辑的文件指针错误

你写的异常回退逻辑存在本质缺陷:

  • 当ujson.load(f)执行抛出异常时,它已经对文件对象f执行了读取操作,此时文件指针会停留在ujson读取结束的位置(绝大多数场景下直接指向文件末尾)。
  • 后续直接调用json.load(f)时,标准库会从当前指针位置开始读取内容,此时能读到的只有空字符串,自然抛出Expecting value: line 1 column 1 (char 0)错误,和文件本身是否为空没有关系。
  • 另外你贴出的回退代码本身存在语法错误:open('performance_data.json', 'r' as f: 中,'r'参数后缺少右括号),运行时会直接触发语法错误。

核心问题2:ujson 加载失败的根因

ujson 无论在终端还是脚本中都报Expected object or value,最常见的原因是你的JSON文件带有UTF-8 BOM头:

  • UTF-8 BOM是文件开头的3个特殊字节\xef\xbb\xbf,是Windows系统下部分编辑器保存文件时自动添加的标记。
  • Python 3.2+版本的标准库json默认会自动忽略开头的BOM头,所以终端里用标准库加载不会报错;但ujson不会自动处理BOM,会直接将其判定为非法JSON内容抛出错误。
  • 如果你近期升级过ujson版本,也可能是新版本收紧了格式校验,旧版本兼容的非标准JSON语法(比如尾随逗号、单行注释)在新版本中会直接报错。

验证与修复步骤

  1. 先确认文件是否存在BOM头,执行以下代码检查:
with open('performance_data.json', 'rb') as f:
    first_3_bytes = f.read(3)
print(first_3_bytes)
# 如果输出为b'\xef\xbb\xbf',即可确认是BOM头导致的ujson加载失败
  1. 修复加载逻辑:打开文件时指定encoding='utf-8-sig'自动兼容BOM头,同时在ujson加载失败后先重置文件指针到文件开头,再调用标准库json加载,修正后的代码如下:
import json
import ujson

with open('performance_data.json', 'r', encoding='utf-8-sig') as f:
    try:
        data = ujson.load(f)
    except ValueError:
        # 将文件指针重置到文件起始位置
        f.seek(0)
        data = json.load(f)
  1. 如果确认没有BOM头,可以把文件内容打印出来排查是否存在ujson不兼容的非标准JSON语法,修正文件格式即可。

补充说明:你单独执行f.readline()能读到内容,是因为那是重新打开的独立文件对象,指针默认在文件起始位置,和之前ujson加载失败的文件对象不是同一个,所以不能作为回退逻辑中文件内容正常的依据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:45:36