![](/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.