Cpickle 无效加载键错误,末尾有奇怪的键
我刚刚尝试更新我写的一个程序,需要添加另一个pickle文件。所以我创建了一个空的 .pkl 文件,然后用这个命令来打开它(就像我之前对其他文件做的那样):
with open('tryagain.pkl', 'r') as input:
self.open_multi_clock = pickle.load(input)
但这次我总是遇到一个很奇怪的错误,原因不明,
cPickle.UnpicklingError: invalid load key, 'Γ'.
这个pickle文件确实包含了可以加载的信息,它和我其他的空 .pkl 文件完全一样,而那些文件都能正常加载。我不知道错误信息中的最后一个键是什么意思,但我怀疑如果我知道它的意思,可能会对我有所帮助。
2 个回答
0
我猜测这些被“腌制”的数据可能会因为输出的字符而影响可移植性。我的建议是在把这些数据写入文件之前,先进行base64编码。以下是我运行的代码:
import base64
import pickle
value_p = pickle.dumps("abdfg")
value_p_b64 = base64.b64encode(value_p)
f = file("output.pkl", "w+")
f.write(value_p_b64)
f.close()
for line in open("output.pkl", 'r'):
readable += pickle.loads(base64.b64decode(line))
>>> readable
'abdfg'
2
我找到了解决这个问题的方法,想花点时间给大家列举一些在使用pickle文件时该做和不该做的例子。首先,解决这个问题的方法其实很简单,就是直接创建一个普通的.txt文件,把pickle数据放进去。
如果你认为必须新建一个文件,并且保存为.pkl格式,那你就错了。我之前是用notepad++创建.pkl文件并保存的。根据我的经验,这种方法有时候有效,有时候又不行。如果你刚接触编程,这可能会让你感到困惑,就像我当初一样。总之,我建议大家还是用普通的.txt文件。这里重要的是文件里面存储的信息,而不一定是文件的扩展名。
#Notice file hasn't been pickled.
#What not to do. No need to name the file .pkl yourself.
with open('tryagain.pkl', 'r') as input:
self.open_multi_clock = pickle.load(input)
正确的方法:
#Pickle your new file
with open(filename, 'wb') as output:
pickle.dump(obj, output, -1)
#Now open with the original .txt ext. DONT RENAME.
with open('tryagain.txt', 'r') as input:
self.open_multi_clock = pickle.load(input)