pickle.dump/load与pickle.dumps/loads的区别是什么?
pickle 序列化/反序列化方法差异
核心区分逻辑:方法名末尾带s的操作对象是内存中的字节对象,不带s的操作对象是磁盘文件对象。
序列化方法对比
pickle.dump(obj, file, ...)
无返回值,将Python对象序列化后直接写入已打开的可写字节流文件中,适合序列化结果需要直接持久化到磁盘的场景。pickle.dumps(obj, ...)
返回bytes类型的序列化结果,不会写入磁盘,适合序列化结果需要在内存中处理的场景,比如网络传输、存入非文件型存储等。
官方说明翻译:pickle.dumps(obj, protocol=None, *, fix_imports=True, buffer_callback=None)
返回对象obj的序列化表示,格式为bytes对象,不会将其写入文件。
反序列化方法对比
pickle.load(file, ...)
从已打开的可读字节流文件中读取内容,反序列化为Python对象,适合直接从磁盘文件还原对象的场景。pickle.loads(data, ...)
接收类字节对象作为输入,反序列化为Python对象,适合从内存中的序列化结果还原对象的场景,比如解析网络传输收到的序列化字节、读取数据库中存储的序列化字段等。
官方说明翻译:pickle.loads(data, /, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None)
返回对象序列化表示data还原后的对象层级结构,data必须是类字节对象。
使用示例
import pickle test_data = {"id": 1, "content": "测试内容"} # 不带s的文件读写流程 with open("test.pkl", "wb") as f: pickle.dump(test_data, f) with open("test.pkl", "rb") as f: data_from_file = pickle.load(f) # 带s的内存处理流程 serialized_bytes = pickle.dumps(test_data) data_from_bytes = pickle.loads(serialized_bytes)
内容的提问来源于stack exchange,提问作者Krishay Rastogi
相关产品推荐
相关产品推荐

