Cpickle无效加载密钥错误,最后有一个奇怪的密钥

时间:2014-08-13 17:12:40

标签: python python-2.7 storage pickle

我只是尝试更新我写的程序,我需要添加另一个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 :(得分:2)

所以我们已经找到了解决这个问题的方法,我想我会花些时间列出一些使用pickle文件时要做什么和不做什么的例子。首先,解决这个问题的方法就是简单地制作一个普通的.txt文件并将pickle数据转储给它。 如果你的印象是你必须实际制作一个新文件并用.pkl结尾保存它,那你就错了。我用notepad ++创建了我的.pkl,并将它们保存为.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)

答案 1 :(得分:0)

猜测腌制数据会丢失输出字符的可移植性。我建议base64对pickle数据进行编码,然后再将其写入文件。我跑了什么:

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'