pickle.loads和pickle.dumps

简介:
在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict:
d = dict(name='Bob', age= 20 , score= 88 )
可以随时修改变量,比如把 name 改成 'Bill' ,但是一旦程序结束,变量所占用的内存就被操作系统全部回收。如果没有把修改后的 'Bill' 存储到磁盘上,下次重新运行程序,变量又被初始化为 'Bob'
我们把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。
序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。
反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。
Python提供了 pickle 模块来实现序列化。
首先,我们尝试把一个对象序列化并写入文件:
>>> import pickle >>> d = dict(name= 'Bob' , age= 20 , score= 88 ) >>> pickle.dumps(d) b'\x80\x03}q\x00(X\x03\x00\x00\x00ageq\x01K\x14X\x05\x00\x00\x00scoreq\x02KXX\x04\x00\x00\x00nameq\x03X\x03\x00\x00\x00Bobq\x04u.'
pickle.dumps() 方法把任意对象序列化成一个 bytes ,然后,就可以把这个 bytes 写入文件。或者用另一个方法 pickle.dump() 直接把对象序列化后写入一个file-like Object:
>>> f = open( 'dump.txt' , 'wb' ) >>> pickle.dump(d, f) >>> f.close()
看看写入的 dump.txt 文件,一堆乱七八糟的内容,这些都是Python保存的对象内部信息。
当我们要把对象从磁盘读到内存时,可以先把内容读到一个 bytes ,然后用 pickle.loads() 方法反序列化出对象,也可以直接用 pickle.load() 方法从一个 file-like Object 中直接反序列化出对象。我们打开另一个Python命令行来反序列化刚才保存的对象:
>>> f = open( 'dump.txt' , 'rb' ) >>> d = pickle.load(f) >>> f.close() >>> d { 'age' : 20 , 'score' : 88 , 'name' : 'Bob' }
变量的内容又回来了!
当然,这个变量和原来的变量是完全不相干的对象,它们只是内容相同而已。
Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据,不能成功地反序列化也没关系。

Help on built-in function loads in module _pickle:

loads(data, *, fix_imports=True, encoding='ASCII', errors='strict')
Read and return an object from the given pickle data.
The protocol version of the pickle is detected automatically, so no
protocol argument is needed. Bytes past the pickled object's
representation are ignored.
Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
which are used to control compatibility support for pickle stream
generated by Python 2. If *fix_imports* is True, pickle will try to
map the old Python 2 names to the new names used in Python 3. The
*encoding* and *errors* tell pickle how to decode 8-bit string
instances pickled by Python 2; these default to 'ASCII' and 'strict',
respectively. The *encoding* can be 'bytes' to read these 8-bit
string instances as bytes objects.

目录
相关文章
|
存储 XML JSON
json模块和pickle模块
json模块和pickle模块
77 0
|
JSON 数据格式 Python
Python json中一直搞不清的load、loads、dump、dumps、eval
Python json中一直搞不清的load、loads、dump、dumps、eval
412 0
Python json中一直搞不清的load、loads、dump、dumps、eval
|
3月前
|
JSON 数据格式
序列化 json和pickle
序列化 json和pickle
|
4月前
|
存储 数据采集 JSON
CSV 和 JSON
【8月更文挑战第15天】
21 3
|
7月前
|
JSON 数据格式 Python
失之毫厘差之千里之load和loads
最近在读pandas库的一些文档的时候,顺便也会将文档上的一些demo在编辑器中进行运行测试,其中在读到pandas处理Json数据这一节的时候,我还是像往常一样,将文档提供的demo写一遍,结果在运行的时候,直接报异常了,我们来看看我的代码和报错信息吧!
|
JSON 数据格式 Python
【python】load与loads、dump与dumps的使用讲解
【python】load与loads、dump与dumps的使用讲解
|
7月前
|
存储 JSON 安全
序列化模块pickle和json有什么区别
序列化模块pickle和json有什么区别
61 0
|
JSON 数据格式 Python
Python中json.load()和json.loads()的区别
Python中json.load()和json.loads()的区别
107 0
|
存储 JSON 前端开发
Json 和 pickle 的区别 | 学习笔记
快速学习 Json 和 pickle 的区别
Json 和 pickle 的区别 | 学习笔记
pickle报错 ValueError: unsupported pickle protocol: 3
pickle报错 ValueError: unsupported pickle protocol: 3