【问题标题】:How can I use my 'namedtuple' structure with 'pickle'? [duplicate]如何将我的“namedtuple”结构与“pickle”一起使用? [复制]
【发布时间】:2016-08-04 12:53:58
【问题描述】:

我已经使用

创建了字典元组
from collections import namedtuple
import random
demand={}
Site_Product=namedtuple("Site_Product", ["site", "product"])   
Products=['P1','P2','P3']    
for P in Products:
    for node in range(1,4): #Suppliers:
        sp=Site_Product(site=node, product=P)
        demand={sp:random.normalvariate(30, 25)}

然后我想保存这些以防我以后使用它,如下所示:

import pickle
PIK = "pickle_SC_detail.dat"  
with open(PIK, "wb") as f:
    pickle.dump(demand, f)

我遇到了一堆错误,主要指向我的 namedtuple 结构:

  File "C:\Users\Ozgu\Anaconda2\lib\pickle.py", line 1376, in dump
    Pickler(file, protocol).dump(obj)

  File "C:\Users\Ozgu\Anaconda2\lib\pickle.py", line 224, in dump
    self.save(obj)

  File "C:\Users\Ozgu\Anaconda2\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self

  File "C:\Users\Ozgu\Anaconda2\lib\pickle.py", line 655, in save_dict
    self._batch_setitems(obj.iteritems())

  File "C:\Users\Ozgu\Anaconda2\lib\pickle.py", line 668, in _batch_setitems
    save(k)

  File "C:\Users\Ozgu\Anaconda2\lib\pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)

  File "C:\Users\Ozgu\Anaconda2\lib\pickle.py", line 401, in save_reduce
    save(args)

  File "C:\Users\Ozgu\Anaconda2\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self

  File "C:\Users\Ozgu\Anaconda2\lib\pickle.py", line 568, in save_tuple
    save(element)

  File "C:\Users\Ozgu\Anaconda2\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self

  File "C:\Users\Ozgu\Anaconda2\lib\pickle.py", line 754, in save_global
    (obj, module, name))

PicklingError: Can't pickle \<class '__main__.Site_Product'\>: it's not found as __main__.Site_Product

是否有解决方法来保存我的元组字典(用于键)或以廉价的方式记录我的数据,以便它们共存?

【问题讨论】:

  • 复制了你的两个代码 sn-ps,使用 Python 2.7.11 对我来说效果很好
  • 有问题的代码适用于我在 Windows 上使用 Python 2.7.11。您确定Site_Product 是在您的真实代码的顶层(而不是函数或方法内部)定义的吗?
  • 是的,这一定是问题所在!它们在不同的功能中,我将尝试将namedtuple设为全局或将它们一起移动。
  • @MuhammadTahir 是对的,您的问题是重复的(应该关闭/删除)。

标签: python python-2.7 pickle namedtuple


【解决方案1】:

事实证明,我是在两个不同的函数中定义代码。将它们结合起来很可能会解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多