问题:为什么在读取一个空文件时出现“ Pickle-EOFError:Ran out of input”的问题?
尝试使用时出现一个有趣的错误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
我尝试读取的文件为空。如何避免出现此错误,而是获取一个空变量?
回答 0
我先检查文件是否为空:
import os
scores = {} # scores is an empty dict already
if os.path.getsize(target) > 0:
with open(target, "rb") as f:
unpickler = pickle.Unpickler(f)
# if file is not empty scores will be equal
# to the value unpickled
scores = unpickler.load()
而且open(target, 'a').close()
在您的代码中什么也不做,您不需要使用;
。
回答 1
这里的大多数答案都涉及如何处理EOFError异常,如果您不确定腌制的对象是否为空,这将非常方便。
但是,如果您对泡菜文件为空感到惊讶,那可能是因为您通过“ wb”或其他可能覆盖了文件的模式打开了文件名。
例如:
filename = 'cd.pkl'
with open(filename, 'wb') as f:
classification_dict = pickle.load(f)
这将覆盖腌制的文件。在使用之前,您可能会错误地这样做:
...
open(filename, 'rb') as f:
然后得到EOFError,因为上一个代码块重写了cd.pkl文件。
在Jupyter或控制台(Spyder)中工作时,我通常会在读取/写入代码上编写一个包装器,然后再调用该包装器。这样可以避免常见的读写错误,并且如果您要多次通过同一个文件读取同一文件,可以节省一些时间。
回答 2
如您所见,这实际上是一个自然错误..
从Unpickler对象读取的典型构造如下:
try:
data = unpickler.load()
except EOFError:
data = list() # or whatever you want
只是引发EOFError,因为它正在读取一个空文件,这仅表示文件末尾 ..
回答 3
腌制的文件很可能为空。
如果要复制和粘贴代码,则覆盖腌制文件非常容易。
例如,以下内容编写了一个pickle文件:
pickle.dump(df,open('df.p','wb'))
而且,如果您复制以下代码以重新打开它,但忘记更改'wb'
为'rb'
,则将覆盖文件:
df=pickle.load(open('df.p','rb'))
正确的语法是
df=pickle.load(open('df.p','wb'))
回答 4
if path.exists(Score_file):
try :
with open(Score_file , "rb") as prev_Scr:
return Unpickler(prev_Scr).load()
except EOFError :
return dict()
回答 5
您可以捕获该异常并从那里返回您想要的任何东西。
open(target, 'a').close()
scores = {};
try:
with open(target, "rb") as file:
unpickler = pickle.Unpickler(file);
scores = unpickler.load();
if not isinstance(scores, dict):
scores = {};
except EOFError:
return {}
回答 6
请注意,打开文件的模式为’a’或其他一些带有字母’a’的模式也会由于覆盖过多而出错。
pointer = open('makeaafile.txt', 'ab+')
tes = pickle.load(pointer, encoding='utf-8')
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。