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

使用Pickle读写二进制文件时出现ValueError的原因解析

ValueError: peek of closed file 错误原因解析

这个错误的核心是pickle在读取数据时,对应的文件对象已经被关闭,导致无法继续访问文件内容。

常见触发场景

  1. 提前手动关闭文件
    先创建pickle的反序列化对象,随后关闭文件,再尝试读取数据时就会触发错误:

    import pickle
    
    f = open('students.dat', 'rb')
    unpickler = pickle.Unpickler(f)
    f.close()  # 提前关闭文件
    data = unpickler.load()  # pickle访问已关闭的文件,触发错误
    print(data)
    
  2. with块外使用依赖文件的pickle对象
    with语句会在代码块结束后自动关闭文件,如果在块外使用已创建的Unpickler实例,同样会访问已关闭的文件:

    import pickle
    
    with open('students.dat', 'rb') as f:
        unpickler = pickle.Unpickler(f)
    # with块结束,文件已关闭
    data = unpickler.load()  # 触发错误
    print(data)
    

另外注意:你第一段代码将数据存入alex.dat,第二段读取的是students.dat,如果这两个文件不是同一文件,可能读取的内容不符合pickle格式,但当前报错是文件关闭问题,优先排查文件对象的生命周期即可。

正确的读取写法

确保在文件处于打开状态时完成所有pickle读取操作:

import pickle

# 推荐用with语句,自动管理文件生命周期
with open('students.dat', 'rb') as f:
    # 读取单个对象
    student_data = pickle.load(f)
    print(student_data)
    
    # 如果是多个对象,循环读取直到文件结束
    # while True:
    #     try:
    #         item = pickle.load(f)
    #         print(item)
    #     except EOFError:
    #         break

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 08:09:17