python pickle保存字典,丢失元组列表

时间:2016-02-10 14:55:20

标签: python dictionary pickle

我是Python的新手。我试图保存我的结果但失败了。有人可以帮我纠正我的代码吗?

parameter = k ##(k is an number)
L = [(1,matrix1), (2,matrix2), (2,matrix2),...]

首先我创建一个字典来放置我的结果

My_dict = {'parameter':k, 'my_list': L}

我使用以下代码保存并阅读:

import pickle
output = open('result.pkl', 'wb')
pickle.dump(My_dict, output, -1)
output.close()

(我在这里检查我的字典,到现在为止一切都是正确的)

但是当我尝试阅读我的数据时:

pkl_file = open('result.pkl', 'rb')
res = pickle.load(pkl_file)
pprint.pprint(res)

我发现我的L是空的,如下所示:

'parameter': k,
'L': []

我的部分代码错了吗?请帮忙吗?

2 个答案:

答案 0 :(得分:0)

我认为问题是我的矩阵是numpy数组。似乎我不应该使用pickle来保存numpy数组。

答案 1 :(得分:0)

我不确定为什么你在挑选numpy数组或矩阵对象时遇到问题。他们应该泡菜。在这里,我使用dill来腌制它们。

>>> import dill
>>> n = numpy.array([[1,2,3],[4,5,6]])
>>> m = numpy.matrix(n)
>>> m
matrix([[1, 2, 3],
        [4, 5, 6]])
>>> dill.dumps(n)
'\x80\x02cdill.dill\n_create_array\nq\x00(cnumpy.core.multiarray\n_reconstruct\nq\x01cnumpy\nndarray\nq\x02K\x00\x85q\x03U\x01bq\x04\x87q\x05(K\x01K\x02K\x03\x86q\x06cnumpy\ndtype\nq\x07U\x02i8q\x08K\x00K\x01\x87q\tRq\n(K\x03U\x01<q\x0bNNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00tq\x0cb\x89U0\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00q\rtq\x0eNtq\x0fRq\x10.'
>>> dill.dumps(m)
'\x80\x02cdill.dill\n_create_array\nq\x00(cnumpy.core.multiarray\n_reconstruct\nq\x01cnumpy.matrixlib.defmatrix\nmatrix\nq\x02K\x00\x85q\x03U\x01bq\x04\x87q\x05(K\x01K\x02K\x03\x86q\x06cnumpy\ndtype\nq\x07U\x02i8q\x08K\x00K\x01\x87q\tRq\n(K\x03U\x01<q\x0bNNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00tq\x0cb\x89U0\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00q\rtq\x0e}q\x0fU\x08_getitemq\x10\x89stq\x11Rq\x12.'

首选方法是使用dump对象附带的numpy方法。你可以从上面的pickle中看到,这基本上是dill正在做的事情,但只是在开头添加了一些小东西(基本上,它还将函数序列化以取消对数组的去除)。

>>> n.dumps()
'\x80\x02cnumpy.core.multiarray\n_reconstruct\nq\x01cnumpy\nndarray\nq\x02K\x00\x85U\x01b\x87Rq\x03(K\x01K\x02K\x03\x86cnumpy\ndtype\nq\x04U\x02i8K\x00K\x01\x87Rq\x05(K\x03U\x01<NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00tb\x89U0\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00tb.'
>>> m.dumps()
'\x80\x02cnumpy.core.multiarray\n_reconstruct\nq\x01cnumpy.matrixlib.defmatrix\nmatrix\nq\x02K\x00\x85U\x01b\x87Rq\x03(K\x01K\x02K\x03\x86cnumpy\ndtype\nq\x04U\x02i8K\x00K\x01\x87Rq\x05(K\x03U\x01<NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00tb\x89U0\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00tb.'

因此,如果pickle本身不能直接使用numpy个对象,则可以使用dill,也可以使用dump / {{1 dumps对象本身的方法。