![](/img/trans.png)
[英]What are the differences between pickle.dump/load and pickle.dumps/loads?
[英]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结束。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.