我得到一个有趣的错误,而试图使用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文件时,我没有使用file.close()。插入这一行,错误就不再存在了。

其他回答

您可以捕获该异常并从那里返回您想要的任何内容。

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 {}

我会先检查文件是否为空:

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()在你的代码中什么也不做,你不需要使用;。

也有同样的问题。原来,当我写入pickle文件时,我没有使用file.close()。插入这一行,错误就不再存在了。

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'))

注意,打开文件的模式是“a”或其他有字母的“a”也会因为覆盖而出错。

pointer = open('makeaafile.txt', 'ab+')
tes = pickle.load(pointer, encoding='utf-8')