我得到一个有趣的错误,而试图使用Unpickler.load(),这是源代码:
open(target, 'a').close()
scores = {};
with open(target, "rb") as file:
unpickler = pickle.Unpickler(file);
scores = unpickler.load();
if not isinstance(scores, dict):
scores = {};
下面是回溯:
Traceback (most recent call last):
File "G:\python\pendu\user_test.py", line 3, in <module>:
save_user_points("Magix", 30);
File "G:\python\pendu\user.py", line 22, in save_user_points:
scores = unpickler.load();
EOFError: Ran out of input
我正在读取的文件是空的。
我如何避免得到这个错误,并得到一个空变量代替?
pickle文件很可能是空的。
如果要复制和粘贴代码,那么覆盖pickle文件非常容易。
例如,下面写一个pickle文件:
pickle.dump(df,open('df.p','wb'))
如果你复制这段代码重新打开它,但忘记把'wb'改为'rb',那么你会覆盖文件:
df=pickle.load(open('df.p','wb'))
正确的语法是
df=pickle.load(open('df.p','rb'))
这里的大多数答案都涉及了如何管理EOFError异常,如果您不确定pickle对象是否为空,这非常方便。
然而,如果您惊讶于pickle文件是空的,这可能是因为您通过'wb'或其他可能覆盖该文件的模式打开了文件名。
例如:
filename = 'cd.pkl'
with open(filename, 'wb') as f:
classification_dict = pickle.load(f)
这将覆盖pickle文件。你可能在使用之前错误地这样做了:
...
open(filename, 'rb') as f:
然后得到EOFError,因为前面的代码块覆盖了cd.pkl文件。
当在Jupyter或在控制台(Spyder)中工作时,我通常在读写代码上编写包装器,然后调用包装器。这避免了常见的读写错误,如果要多次读取同一个文件,还节省了一些时间