为什么我在读取空文件时收到“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

我要读取的文件是空的。我怎样才能避免出现这个错误,而是得到一个空变量?

原文由 Magix 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

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

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

原文由 Padraic Cunningham 发布,翻译遵循 CC BY-SA 3.0 许可协议

这里的大部分答案都涉及如何管理 EOFError 异常,如果您不确定 pickled 对象是否为空,这将非常方便。

但是,如果您对 pickle 文件为空感到惊讶,可能是因为您通过“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) 中工作时,我通常会在读/写代码上编写一个包装器,然后调用包装器。这避免了常见的读写错误,如果您要多次读取同一个文件,则可以节省一些时间

原文由 Abhay Nainan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题