我的泡菜功能正常运作
with open(self._prepared_data_location_scalar, 'wb') as output:
# company1 = Company('banana', 40)
pickle.dump(X_scaler, output, pickle.HIGHEST_PROTOCOL)
pickle.dump(Y_scaler, output, pickle.HIGHEST_PROTOCOL)
with open(self._prepared_data_location_scalar, 'rb') as input_f:
X_scaler = pickle.load(input_f)
Y_scaler = pickle.load(input_f)
然而,我很好奇,泡菜是如何知道加载的?这是否意味着一切都必须按照相同的顺序?
答案 0 :(得分:6)
你有什么好。它是documented feature的泡菜:
可以对同一个Pickler实例的dump()方法进行多次调用。然后必须将它们匹配到相应Unpickler实例的load()方法的相同调用次数。
这里没有魔力,pickle是一种非常简单的基于堆栈的语言,它将python对象序列化为字节串。 pickle格式知道对象边界:根据设计,pickle.dumps('x') + pickle.dumps('y')
与pickle.dumps('xy')
的字节串不同。
如果您有兴趣了解有关实施的一些背景信息,this article可以轻松阅读python pickler。
答案 1 :(得分:3)
我建议只做
pickle.dump({"X":X_scalar,"Y":Y_scalar},output)
...
data = pickle.load(fp)
print "Y_scalar:",data['Y']
print "X_scalar:",data['X']
除非您有非常令人信服的理由保存和加载数据,就像您在问题中一样......
它从文件的开头加载到结尾(即它们按照它们被转储的顺序加载它们)
答案 2 :(得分:1)
是的,pickle以保存的顺序挑选对象。
直观地说,pickle在写入(转储)到文件时追加到最后, 并按顺序读取(加载)文件中的内容。
因此,订单会被保留,允许您按照序列化的确切顺序检索数据。