Mag*_*gix 79 python file pickle
我在尝试使用时遇到了一个有趣的错误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 = {};
Run Code Online (Sandbox Code Playgroud)
这是追溯:
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
Run Code Online (Sandbox Code Playgroud)
我想读的文件是空的.如何避免出现此错误,并获取空变量?
Pad*_*ham 90
我先检查文件是不是空的:
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()
Run Code Online (Sandbox Code Playgroud)
open(target, 'a').close()您的代码中也没有任何操作,您也不需要使用;.
Abh*_*nan 86
这里的大多数答案都涉及如何管理EOFError异常,如果您不确定是否为空,那么这是非常方便的.
但是,如果您对pickle文件为空感到惊讶,可能是因为您通过'wb'或其他可能覆盖该文件的模式打开了文件名.
例如:
filename = 'cd.pkl'
with open(filename, 'wb') as f:
classification_dict = pickle.load(f)
Run Code Online (Sandbox Code Playgroud)
这将覆盖pickle文件.您可能在使用之前错误地完成了此操作:
...
open(filename, 'rb') as f:
Run Code Online (Sandbox Code Playgroud)
然后获得了EOFError,因为前面的代码块覆盖了cd.pkl文件.
在Jupyter或控制台(Spyder)中工作时,我通常会在读/写代码上写一个包装器,然后调用包装器.这样可以避免常见的读写错误,如果您要通过艰难的程度多次读取同一个文件,可以节省一些时间
use*_*494 17
腌制文件很可能是空的。
如果您正在复制和粘贴代码,覆盖pickle 文件非常容易。
例如下面写了一个pickle文件:
pickle.dump(df,open('df.p','wb'))
Run Code Online (Sandbox Code Playgroud)
如果您复制此代码以重新打开它,但忘记更改'wb'为,'rb'那么您将覆盖该文件:
df=pickle.load(open('df.p','wb'))
Run Code Online (Sandbox Code Playgroud)
正确的语法是
df=pickle.load(open('df.p','rb'))
Run Code Online (Sandbox Code Playgroud)
如您所见,这实际上是一个自然错误..
从 Unpickler 对象读取的典型构造是这样的..
try:
data = unpickler.load()
except EOFError:
data = list() # or whatever you want
Run Code Online (Sandbox Code Playgroud)
EOFError 只是引发了,因为它正在读取一个空文件,它只是意味着文件结束..
| 归档时间: |
|
| 查看次数: |
133219 次 |
| 最近记录: |