序列化指的是把内存的数据类型转换成一个特定格式的内容,该格式的内容可用于存储或者传输给其他平台使用。
序列化得到的特定格式内容有两种用途
针对用途1的格式:
针对用途2的格式:
import json
res = json.dumps([1,‘abc‘,True])
print(res,type(res))
[1, "abc", true] <class ‘str‘> 单引号变双引号
# 将序列化的内容写入文件
with open(‘test.txt‘,mode=‘wt‘,encoding=‘utf-8‘) as f:
res = json.dumps([1,‘abc‘,True])
f.write(res)
li = json.loads(res)
print(li,type(li))
[1, ‘abc‘, True] <class ‘list‘>
# 双引号会变为单引号
# 将写入文件的内容读出并反序列化
with open(‘test.txt‘,mode=‘r‘,encoding=‘utf-8‘) as f:
res1 = json.loads(f.read())
print(res1,type(res1))
[1, ‘abc‘, True] <class ‘list‘>
注意:在python解释器2.7与3.6之后都可以json.loads(bytes类型),但唯独3.5不可以。
>>> import json
>>> json.loads(b‘{"a":111}‘)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/linhaifeng/anaconda3/lib/python3.5/json/__init__.py", line 312, in loads
s.__class__.__name__))
TypeError: the JSON object must be str, not ‘bytes‘
json.dump(date,file_obj):将传进去的date序列化为JSON格式后写入文件对象file_obj。
>>> import json
>>> with open(‘a.txt‘,mode=‘wt‘,encoding=‘utf-8‘) as f:
... json.dump([True,None,"abc"],f)
[true, null, "abc"]
json.load(file_obj):读取文件内容将其反序列化,返回反序列化后的内容。
>>> with open(‘a.txt‘,mode=‘rt‘,encoding=‘utf-8‘) as f:
... res = json.load(f)
...
>>> res
[True, None, ‘abc‘]
json格式序列化后与原数据类型的区别:
原数据格式 | JSON |
---|---|
True | true |
False | false |
None | null |
‘abc‘ | "abc" |
JSON序列化默认支持的对象和类型:
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str | string |
int, float, int 和 float 派生的枚举 | number |
True | true |
False | false |
None | null |
反序列化支持的对象和类型:
JSON | Python |
---|---|
object | dict |
array | list |
string | str |
number (int) | int |
number (real) | float |
true | True |
false | False |
null | None |
模块 pickle
实现了对一个 Python 对象结构的二进制序列化和反序列化。
pickle
模块并不安全。你只应该对你信任的数据进行unpickle操作,构建恶意的 pickle 数据来在解封时执行任意代码是可能的。绝对不要对不信任来源的数据和可能被篡改过的数据进行解封。考虑使用 hmac
来对数据进行签名,确保数据没有被篡改。
pickle.dumps():序列化。
import pickle
res = pickle.dumps({1,2,3,4,5,‘a‘}
print(res,type(res))
# b‘\x80\x04\x95\x13\x00\x00\x00\x00\x00\x00\x00\x8f\x94(K\x01K\x02K\x03K\x04K\x05\x8c\x01a\x94\x90.‘ <class ‘bytes‘>
pickle.loads():反序列化。
res1 = pickle.loads(res)
print(res1,type(res1))
# {1, 2, 3, 4, 5, ‘a‘} <class ‘set‘>
pickle.dump(obj,file):将对象 obj 封存以后的对象写入已打开的file文件对象。
with open(‘a.txt‘,mode=‘wb‘) as f:
pickle.dump({‘k1‘:None,"k2":‘abc‘},f)
pickle.load(f):从已打开的文件 中读取封存后的对象,重建其中特定对象的层次结构并返回。
with open(‘a.txt‘,mode=‘rb‘) as f:
res = pickle.load(f)
print(res)
{‘k1‘: None, ‘k2‘: ‘abc‘}
注意:pickle序列化后的内容为bytes类型,所以打开文件必须要为b模式。
# coding:utf-8
import pickle
with open(‘a.pkl‘,mode=‘wb‘) as f:
# 一:在python3中执行的序列化操作如何兼容python2
# python2不支持protocol>2,默认python3中protocol=4
# 所以在python3中dump操作应该指定protocol=2
pickle.dump(‘你好啊‘,f,protocol=2)
with open(‘a.pkl‘, mode=‘rb‘) as f:
# 二:python2中反序列化才能正常使用
res=pickle.load(f)
print(res)
utf-8
编码),而 pickle 是一个二进制序列化格式;https://docs.python.org/zh-cn/3/library/json.html?highlight=json#module-json
原文:https://www.cnblogs.com/ChiRou/p/14135832.html