Cpickle 无效加载键错误,末尾有奇怪的键

0 投票
2 回答
9206 浏览
提问于 2025-04-18 17:10

我刚刚尝试更新我写的一个程序,需要添加另一个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)

撰写回答