繁体   English   中英

`pickle.dump(d,f)`相当于`f.write(pickle.dumps(d))`?

[英]Is `pickle.dump(d, f)` equivalent to `f.write(pickle.dumps(d))`?

给定一个任意可选择的Python数据结构data ,是

with open('a', 'bw') as f:
    f.write(pickle.dumps(data))

相当于

with open('a', 'bw') as f:
    pickle.dump(data, f)

即在编写代码时我可以假设这种等价吗? 你能描述一下你是如何得出这个结论的吗?

用例是将序列化与写入分开,因为我可能想将pickle写入非磁盘位置。

是的,它们是等价的。 看一下pickle.py的源代码:

def _dump(obj, file, protocol=None, *, fix_imports=True):
    _Pickler(file, protocol, fix_imports=fix_imports).dump(obj)

def _dumps(obj, protocol=None, *, fix_imports=True):
    f = io.BytesIO()
    _Pickler(f, protocol, fix_imports=fix_imports).dump(obj)
    res = f.getvalue()
    assert isinstance(res, bytes_types)
    return res

dumps做同样的事情作为dump ,只是用io.BytesIO对象,而不是一个文件对象。 它以相同的方式调用内部_Pickler().dump()并简单地返回io.BytesIO对象的内容。 因此,所有f.write(pickle.dumps(data))都会先将结果转发给io.BytesIO对象,然后转发到实际文件,而不是直接写入文件。

如果在酸洗过程中发生异常,它们不相等。 f.write(pickle.dumps(data))不会向文件写入任何内容。 pickle.dump(data, f)将以pickle.dump(data, f)或partial pickle结束。

是。

转储文档非常清楚:

将对象的pickled表示作为bytes对象返回,而不是将其写入文件。

将相同的表示写入文件将与直接调用pickle.dump相同。

另外,“file”在这里表示任何带有write方法的东西,来自dump的文档

file参数必须具有接受单个字节参数的write()方法。 因此,它可以是为二进制写入打开的磁盘文件,io.BytesIO实例或满足此接口的任何其他自定义对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM