【问题标题】:python pickle save dictionary, a list of tuples is lostpython pickle保存字典,元组列表丢失
【发布时间】:2016-02-10 14:55:20
【问题描述】:

我是 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': []

我的代码哪里出错了?有人可以帮忙吗?

【问题讨论】:

  • 您的第一行代码有错字(最后一个冒号在引号内),但您的代码中是这样还是转录错误?编辑现在修复
  • 对不起,那个错字现在是正确的。运行代码时没有显示错误信息。空 L 是唯一的问题。
  • 感谢您更新,Rosy,但第一行仍会抛出 SyntaxError,因为您将 'my_list' 的值留空,然后在其后包含一个没有键的列表。
  • 去掉逗号分隔冒号和变量L
  • 谢谢,已删除。但这是我的错字,不是我的问题。

标签: python dictionary pickle


【解决方案1】:

我认为问题在于我的矩阵是 numpy 数组。看来我不应该使用泡菜来保存 numpy 数组。

【讨论】:

  • 为什么不呢?通常你应该使用内置的“转储”......但酸洗仍然有效。
【解决方案2】:

我不确定您为什么在酸洗 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.'

首选方法是使用numpy 对象附带的dump 方法。从上面的pickle可以看出,这本质上是dill在做的,只是在开头加了一些小东西(基本上也是序列化了unpickle数组的函数)。

>>> 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,或者你可以对numpy 对象本身使用dump/dumps 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    相关资源
    最近更新 更多