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

加载Pickle文件出现EOFError,如何向Pickle文件追加保存游戏历史分数?

问题分析与修复方案

代码存在的核心问题

  • 打开文件的顺序和模式错误:你先执行了outfile = open(filename,'wb'),wb模式打开已存在的文件时会直接清空文件所有内容,后续执行读取操作时文件已经是空的,自然会触发EOFError: Ran out of input错误。
  • 资源管理不规范:写入文件的对象没有使用上下文管理器管理,容易出现文件句柄泄漏、缓存没刷新导致内容没写入磁盘的问题。
  • 未兼容边界场景:如果是第一次运行程序、分数文件还不存在的情况,直接读取会报错,需要做初始化兼容。

正确实现代码

import pickle

new_score = 9
filename = "scoreTest.pk"

# 第一步:先读取已有分数
try:
    with open(filename, 'rb') as infile:
        scores = pickle.load(infile)
except (FileNotFoundError, EOFError):
    # 首次运行无文件、或文件损坏为空时,初始化空的分数集合
    scores = set()

# 第二步:添加新分数
scores.add(new_score)

# 第三步:写入更新后的分数数据
with open(filename, 'wb') as outfile:
    pickle.dump(scores, outfile)

代码说明

  • 调整了读写顺序:先完成读操作再执行写操作,避免写模式提前清空文件导致读失败
  • 所有文件操作都用with上下文管理器包裹,操作完成后会自动关闭文件,不需要手动调用close()方法
  • 增加了异常捕获逻辑,兼容第一次运行、文件损坏的边界场景
  • 如果你的业务允许分数重复,可以把set()换成list(),对应的添加方法从add()改成append()即可

内容的提问来源于stack exchange,提问作者Mr. Krouton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:36:05