泡菜怎么知道选哪个?

时间:2016-10-19 17:15:24

标签: python pickle

我的泡菜功能正常运作

    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)

然而,我很好奇,泡菜是如何知道加载的?这是否意味着一切都必须按照相同的顺序?

3 个答案:

答案 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)

哇我甚至都不知道你能做到这一点...而且我已经使用python很长一段时间了......所以我的书非常棒,但是你真的不应该这样做会很难以后工作​​(特别是如果你不工作)

我建议只做

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在写入(转储)到文件时追加到最后, 并按顺序读取(加载)文件中的内容。

因此,订单会被保留,允许您按照序列化的确切顺序检索数据。