Python 2.7 加载pickle文件
我正在努力让“泡菜入门”的脚本生效。我设法从一个文件中保存了一个pickle文件,并加载了它。但是,当我将pickle文件保存在一个文件中(本例中为Python 2.7 加载pickle文件,python-2.7,pickle,Python 2.7,Pickle,我正在努力让“泡菜入门”的脚本生效。我设法从一个文件中保存了一个pickle文件,并加载了它。但是,当我将pickle文件保存在一个文件中(本例中为main.py)并从另一个文件加载它时,我得到了一个错误。我可能错过了一些小东西,但不知道是什么 main.py import pickle class Node: """This class represents a node""" def __init__(self, value = None): self.val = val
main.py
)并从另一个文件加载它时,我得到了一个错误。我可能错过了一些小东西,但不知道是什么
main.py
import pickle
class Node:
"""This class represents a node"""
def __init__(self, value = None):
self.val = value
def toString(self):
return self.val
class Link:
"""This class represents a link between 2 nodes"""
def __init__(self, sourceNode, targetNode, LinkWigth):
self.source = sourceNode
self.target = targetNode
self.wight = LinkWigth
def setWeight(self, newWeight):
self.wight = newWeight
def toString(self):
return self.wight
class Graph:
"""This class represents a graph"""
def __init__(self):
self.nodes = []
self.links = []
def addNode(self, node):
self.nodes.append(node)
def addLink(self, link):
self.links.append(link)
def getInDegree(self, node):
counter = 0
for link in self.links:
if link.target == node:
counter +=1
else:
print "target is: %s" % link.target.toString()
print "source is: %s" % link.source.toString()
return counter
def toString(self):
for link in self.links:
print link.toString()
for node in self.nodes:
print node.toString()
if __name__ == "__main__":
n1 = Node(4)
l1 = Link(n1, n1, 1)
g = Graph()
g.addNode(n1)
g.addLink(l1)
pickle.dump(g, open('haha', 'wb') )
pickloader.py
import pickle
import main
n = main.Node(44)
print n.toString()
g = pickle.load( open('haha', 'rb') )
print "ha"
错误
C:\Users\R\Desktop\pickle test>main.py
C:\Users\R\Desktop\pickle test>pickleLoader.py
44
Traceback (most recent call last):
File "C:\Users\R\Desktop\pickle test\pickleLoader.py", line 7, in <module>
g = pickle.load( open('haha', 'rb') )
File "C:\Program Files\Python27\lib\pickle.py", line 1378, in load
return Unpickler(file).load()
File "C:\Program Files\Python27\lib\pickle.py", line 858, in load
dispatch[key](self)
File "C:\Program Files\Python27\lib\pickle.py", line 1069, in load_inst
klass = self.find_class(module, name)
File "C:\Program Files\Python27\lib\pickle.py", line 1126, in find_class
klass = getattr(mod, name)
AttributeError: 'module' object has no attribute 'Graph'
C:\Users\R\Desktop\pickle test>
C:\Users\R\Desktop\pickle test>main.py
C:\Users\R\Desktop\pickle test>pickleLoader.py
44
回溯(最近一次呼叫最后一次):
文件“C:\Users\R\Desktop\pickle test\pickleLoader.py”,第7行,在
g=pickle.load(打开('haha','rb'))
文件“C:\Program Files\Python27\lib\pickle.py”,第1378行,正在加载
返回Unpickler(file.load())
加载文件“C:\Program Files\Python27\lib\pickle.py”,第858行
调度[键](自身)
文件“C:\Program Files\Python27\lib\pickle.py”,第1069行,装入说明
klass=self.find_类(模块,名称)
文件“C:\Program Files\Python27\lib\pickle.py”,第1126行,在find_类中
klass=getattr(mod,name)
AttributeError:“模块”对象没有属性“图形”
C:\Users\R\Desktop\pickle test>
我想问题出在名称空间上,因为已经导入了
main.py
,但我不知道如何让它工作。这似乎与如何定义与模块相关的类有关。允许此操作的快速方法是将main
模块的组件直接导入pickloader
:
from main import Graph, Node, Link
更好的解决方案可能是将公共组件(图形、节点、链接)移动到它们自己的模块中,然后将该模块导入到
main
和pickleLoader
中,这要感谢它的工作。但是为什么将这三个组件移动到不同的模块会更好呢?将它们放在一个单独的模块中(并导入该模块)将有助于避免名称空间冲突。当前方法要求将类型引入当前名称空间。将它们放在一个单独的模块中并导入,这样将使它们保留在自己的命名空间中。