【问题标题】:Cpickle invalid load key error with a weird key at the endCpickle 无效的加载键错误,最后有一个奇怪的键
【发布时间】:2014-08-13 17:12:39
【问题描述】:

我刚刚尝试更新我编写的程序,我需要添加另一个泡菜文件。所以我创建了空白的 .pkl,然后使用这个命令打开它(就像我对所有其他人所做的那样):

with open('tryagain.pkl', 'r') as input:
  self.open_multi_clock = pickle.load(input)

只有这一次,我不断收到这个非常奇怪的错误,没有明显的原因,

cPickle.UnpicklingError: invalid load key, 'Γ'.

pickle 文件确实包含要加载的必要信息,它与我拥有的其他空白 .pkl 完全匹配,并且它们加载正常。我不知道错误中的最后一个键是什么,但我怀疑如果我知道它的含义,这可能会给我一些启发。

【问题讨论】:

  • 你是怎么腌制到文件的?
  • 我有一个空白 .pkl 文件的标题,我只是将它复制到我的新空白 .pkl
  • 为什么会有空白的pickle文件?
  • 它刚刚添加到我的程序中,所以没有任何信息写入它。我并不是说完全空白,正如我所说的那样,它确实有必要的标题来使它成为.pkl。所以它不是完全空的,它们只是没有数据当前存储在其中,因为它实际上还没有打开。
  • 我还是不明白,为什么要手动复制数据,为什么不使用pickle转储?

标签: python python-2.7 storage pickle


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    猜猜腌制数据会因输出字符而影响可移植性。我建议在将腌制数据写入文件之前对其进行 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'
    

    【讨论】:

    • 谢谢,我会在我的代码中尝试一下,如果它有效,我会接受它。虽然,当这个泡菜文件和正常工作的文件之间没有明显区别时,你是否知道为什么会突然发生这种情况?看起来对于一个简单的任务有很多额外的代码,你知道吗?
    • 我仍然遇到同样的错误,我很确定这个问题的答案在于最后的那个符号。
    • 可能是。但是手动复制和粘贴会弄乱编码。即 python 使东西打印得漂亮的魔法。输入/输出(具体是屏幕的本地键盘,以便您可以用您的语言阅读)无法正常工作的示例:stackoverflow.com/questions/20884036/…
    • 你会删除你以前的“.pkl”文件并给我的代码吗?它在我的机器上运行。
    猜你喜欢
    • 1970-01-01
    • 2013-01-12
    • 2015-12-03
    • 2017-12-20
    • 2018-03-28
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多