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

使用r+模式打开JSON文件时为什么无法在同一个with块内同时执行dump和load

报错原因解释

你遇到的报错本质是文件指针位置导致的:
当你使用r+模式打开文件时,初始文件指针处于文件起始位置。调用json.dump()写入内容后,文件指针会自动移动到刚写入内容的末尾位置,此时直接执行json.load(),会从指针当前的末尾空白处读取内容,没有任何有效JSON数据,因此触发JSONDecodeError。

拆分两个with块可以正常运行的原因是:第一个with块执行完毕后文件自动关闭,第二个with块重新打开文件时,文件指针默认重置到起始位置,因此可以正常读取完整的JSON内容。

如果需要在同一个r+模式的with块内完成写入后读取,只需要在写入后手动调整指针位置即可,修复代码如下:

import json

# 假设current_contents已经提前定义
with open('username.json', "r+") as f:
    json.dump(current_contents, f)
    f.truncate() # 清空当前指针之后的旧文件残留内容,避免读写长度不匹配导致的解析错误
    f.seek(0) # 手动重置文件指针到文件起始位置
    newlist = json.load(f)
print(newlist)
r+模式的适用场景

r+是可读可写模式,不会清空原有文件内容,也不会在文件不存在时自动创建,适合以下场景:

  • 大文件的局部更新:不需要读取整个文件内容,只修改指定偏移位置的内容,大幅降低IO开销
  • 二进制文件的定点修改:比如修改图片、压缩包的指定字节片段,避免重写整个文件
  • 低开销的读写联动操作:需要先读原文件内容做修改,再写入更新,不需要多次打开文件,只要手动控制好文件指针位置即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:54:03