本篇内容收录于《填坑记》,内容不定期更新中…
一、问题
问题:
pickle.load() 方法加载文件报错:EOFError: Ran out of input
入坑原因:
使用pickle.load() 方法加载一个空文件或者文件未正确写入导致出错。
if os.path.exists(model_path):
print('model %s 存在' % model_path)
# 以二进制文件读取
return pickle.load(open(model_path, "rb"))
那为什么加载空文件以及写入不正确会导致出错?
当 pickle.load() 尝试从一个文件中反序列化对象,但是发现文件到达了末尾(EOF,End Of File),却没有读到任何可以反序列化的内容时,就会抛出 EOFError: Ran out of input
的错误。
二、解决
解决步骤:
-
确认文件不为空:首先确认
model_path
指向的文件不是空的。你可以检查文件的大小,确保它包含一些数据。 -
正确写入数据:确保在之前的某个环节,使用
pickle.dump()
成功地将对象写入了文件。且写入操作没有中断,文件已被正确关闭。 -
异常处理:在加载文件之前,添加异常处理逻辑,以便更优雅地处理这个错误或进行调试。
-
检查文件路径:确保
model_path
正确指向了你想要加载的文件,并且该文件有内容。
代码修改:
增加了基本异常处理和文件检查,之后不再直接提示此类错误:
if os.path.exists(model_path):
print('model %s 存在' % model_path)
# 检查文件是否为空
if os.path.getsize(model_path) > 0:
try:
# 以二进制文件读取
with open(model_path, "rb") as file:
return pickle.load(file)
except EOFError:
print("文件 %s 为空或不包含可加载的数据。" % model_path)
else:
print("文件 %s 为空。" % model_path)
这样,如果文件为空或不包含可加载的数据,将获得清晰的错误提示,而不是直接抛出 EOFError
,让人不知所云。OK,到这里,坑就填上了。
填坑者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)