使用Pickle读写二进制文件时出现ValueError的原因解析
ValueError: peek of closed file 错误原因解析
这个错误的核心是pickle在读取数据时,对应的文件对象已经被关闭,导致无法继续访问文件内容。
常见触发场景
提前手动关闭文件
先创建pickle的反序列化对象,随后关闭文件,再尝试读取数据时就会触发错误:import pickle f = open('students.dat', 'rb') unpickler = pickle.Unpickler(f) f.close() # 提前关闭文件 data = unpickler.load() # pickle访问已关闭的文件,触发错误 print(data)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
相关产品推荐
相关产品推荐

