使用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
相关产品推荐
相关产品推荐

