是什么导致错误“_pickle.UnpicklingError:无效加载密钥,''。”?

时间:2015-10-10 02:40:54

标签: python pickle

我正在尝试在阵列上存储5000个数据元素。这5000个元素存储在现有文件中(因此它不是空的)。

但是我收到了一个错误,我不知道是什么导致它。

在:

def array():

    name = 'puntos.df4'

    m = open(name, 'rb')
    v = []*5000

    m.seek(-5000, io.SEEK_END)
    fp = m.tell()
    sz = os.path.getsize(name)

    while fp < sz:
        pt = pickle.load(m)
        v.append(pt)

    m.close()
    return v

OUT:

line 23, in array
pt = pickle.load(m)
_pickle.UnpicklingError: invalid load key, ''.

7 个答案:

答案 0 :(得分:9)

酸洗是递归的,而不是顺序的。因此,为了挑选一个列表,pickle将开始挑选包含列表,然后挑选第一个元素...潜入第一个元素并腌制依赖项和子元素,直到第一个元素被序列化。然后转到列表的下一个元素,依此类推,直到它最终完成列表并完成序列化封闭列表。简而言之,除了一些特殊情况外,很难将递归的pickle视为顺序。如果您想以特殊方式dump,最好在load上使用更智能的模式。

最常见的腌菜,用一个dump来腌制所有文件 - 然后你必须使用一个load同时load一切。但是,如果您打开一个文件句柄并执行多个dump调用(例如,对于列表的每个元素一个或所选元素的元组一个),那么您的load将镜像...您打开文件处理并执行多个load调用,直到您拥有所有列表元素并可以重建列表。但是,选择性load仅限某些列表元素仍然不容易。要做到这一点,您可能必须使用像dict这样的包来将列表元素存储为klepto(以元素或块的索引作为键),这可以分解腌制dict透明地放入几个文件中,并且可以轻松加载特定元素。

Saving and loading multiple objects in pickle file?

答案 1 :(得分:3)

我不能完全确定您尝试通过寻求特定的偏移并尝试手动加载单个值来实现的目标,pickle模块的典型用法是:

# save data to a file
with open('myfile.pickle','wb') as fout:
    pickle.dump([1,2,3],fout)

# read data from a file
with open('myfile.pickle') as fin:
    print pickle.load(fin)

# output
>> [1, 2, 3]

如果你转储了一个列表,你将加载一个列表,不需要单独加载每个项目。

你说你在寻找-5000偏移量之前有错误,也许你试图读取的文件已损坏。

如果您有权访问原始数据,我建议您尝试将其保存到新文件并按照示例中的说明进行阅读。

答案 2 :(得分:2)

这可能与您的具体问题无关,但在使用gzip创建pickle存档时遇到了类似的问题。

例如,如果压缩的pickle存档是这样的,

import gzip, pickle
with gzip.open('test.pklz', 'wb') as ofp:
    pickle.dump([1,2,3], ofp)

尝试打开它会引发错误

 with open('test.pklz', 'rb') as ifp:
     print(pickle.load(ifp))
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
_pickle.UnpicklingError: invalid load key, ''.

但是,如果使用gzip打开pickle文件,则一切都很和谐

with gzip.open('test.pklz', 'rb') as ifp:
    print(pickle.load(ifp))

[1, 2, 3]

答案 3 :(得分:1)

当我将一个* .p文件上传到Google云端硬盘时,我遇到了类似的错误,但上下文不同。我稍后在Google Colab会话中尝试使用它,并收到此错误:

    1 with open("/tmp/train.p", mode='rb') as training_data:
----> 2     train = pickle.load(training_data)
UnpicklingError: invalid load key, '<'.

我通过压缩文件,上传并在会话上解压缩来解决它。 在您上载/下载泡菜文件时,泡菜文件似乎没有正确保存,因此已损坏。

答案 4 :(得分:1)

我通过以下方式解决了我的问题:

  • 删除克隆的项目
  • 安装git lfssudo apt-get install git-lfs
  • 为您的用户帐户设置 git lfs:git lfs install
  • 再次克隆项目。

我希望你也觉得它有用。

答案 5 :(得分:1)

我在加载腌制 sklearn 模型时收到了类似的错误。问题是泡菜是通过 sklearn.externals.joblib 创建的,我试图通过标准泡菜库加载它。使用 joblib 解决了我的问题。

答案 6 :(得分:0)

如果通过磁盘或其他方式传输了这些文件,则可能是未正确保存它们。