簡體   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