一:pickle 序列化模块
把不可以直接存储的数据,变得可存储就是序列化
把存储好的数据,转化成本来的数据类型,加作反序列化
php: 序列化和反序列化
(1)serialize
(2)unserialize
#1.dumps 把任意对象序列化成一个bytes
#例:php
#导入pickle模块 => 模块.方法()
import picklepython
lst = [1,2,3,4,5,6]
res = pickle.dumps(lst)
print(res,type(res))
#b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04K\x05K\x06e.' <class 'bytes'>
#2.loads 把任意bytes反序列化成原来数据编程
res = pickle.loads(res)
print(res,type(res))
#encode decode 能实现序列化吗?
'''只有字符串能够使用encode 或 decode ,容器类型数据等不能够'''
#res = lst.encode("utf-8")
#print(res)
#对函数进行序列化json
#例2:编程语言
import pickle
def func():
print("哈哈哈哈哈哈哈哈哈哈")
func()
# 序列化成字符串
res = pickle.dumps(func)
print(res)
#反序列化字节流 恢复原来的数据类型
res = pickle.loads(res)
print(res)
res()
对函数序列化例2输出结果为:函数
哈哈哈哈哈哈哈哈哈哈spa
b'\x80\x03c__main__\nfunc\nq\x00.'code
<function func at 0x00000208DE411E18>对象
哈哈哈哈哈哈哈哈哈哈排序
#对迭代器进行序列化
import pickle
it = iter(range(10))
from collections import Iterable,Iterator
print(isinstance(it,Iterator))
res = pickle.dumps(it) #序列化
res = pickle.loads(res) #反序列化
for i in res:
print(i) #输出:0 1 2 3 4 5 6 7 8 9
#全部数据类型均可以经过pickle模块进行序列化
#dump 把对象序列化后写入到file_like Object(即文件对象)
#load 把file_like Object(即文件对象)中的内容拿出来,反序列化原来数据
it = iter(range(10))
with open("ceshi.pkl",mode="wb") as fp:
pickle.dump(it,fp)
with open("ceshi.pkl",mode="rb") as fp:
res = pickle.load(fp)
print(res)
for i in res:
print(i)
二:json
json 模块可以转化的数据类型以下:int float bool str list tuple dict None 8个数据能够序列化
json 数据类型的提出,是让不一样的语言之间造成数据交流
pickle 返回的是二进制的字节流,它是用来进行数据的传输和存储的
json 序列化成一个字符串
pickle 序列化成一个字节流
#例:
import json
#dumps 和 loads 是一对,用来序列化和反序列化的,在字符串和其余数据之间切换
#序列化
#ensure_ascii = True 若是想要显示中文ensure_ascii = False
#sort_keys = True 对字典的键进行排序(默认按照ascii从小到大排序)
#例1:
dic = {'name':"ONE","age":8,"sex":"BOY","family":['FF',"MM"]}
res = json.dumps(dic,ensure_ascii=True,sort_keys=True)
print(res,type(res)) #{"age": 8, "family": ["FF", "MM"], "name": "ONE", "sex": "BOY"} <class 'str'>
#反序列化
res = json.loads(res)
print(res,type(res)) #{'age': 8, 'family': ['FF', 'MM'], 'name': 'ONE', 'sex': 'BOY'} <class 'dict'>
# #dump 和 load 是一对,用来进行数据的存储和提取
#例2:(将dic写入到ceshi001.json到在经过load读出)
dic = {'name':"ONE","age":8,"sex":"BOY","family":['FF',"MM"]}
with open("ceshi001.json",mode="w",encoding="utf-8") as fp:
res1 = json.dump(dic,fp,ensure_ascii=False)
with open("ceshi001.json",mode="r",encoding="utf-8") as fp:
res = json.load(fp)
print(res,type(res))
三:json 和 pickle 两个模块之间的区别
#json
能够连续dump,可是load只能一次性把全部数据拿出来,进行反序列化,形成数据错误
针对于这个弊端,能够使用loads来解决
dic = {'a':1,'b':2}
with open('ceshi002.json',mode="w",encoding='utf-8') as fp:
json.dump(dic,fp)
fp.write('\n')
json.dump(dic,fp)
fp.write('\n')
print("=====================")
with open("ceshi002.json",mode="r",encoding="utf-8") as fp:
#res = json.load(fp) error
for i in fp:
#读一行,反序列化成一个字典,一次循环
res= json.loads(i)
print(res,type(res))
#pickle
容许连续dump,也容许连续load
#例1:
import pickle
dic = {'a':3,'b':4}
with open("ceshi003.pkl",mode="wb") as fp:
pickle.dump(dic,fp)
pickle.dump(dic,fp)
pickle.dump(dic,fp)
pickle.dump(dic,fp)
with open("ceshi003.pkl",mode="rb") as fp:
'''
res = pickle.load(fp)
print(res)
res = pickle.load(fp)
print(res)
res = pickle.load(fp)
print(res)
res = pickle.load(fp)
print(res)
'''
#res = pickle.load(fp)
#print(res)
#是否能够把全部数据都一次性拿出来
#用try...except..抑制多调用的那一次的报错
#异常格式
try:
while True:
res = pickle.load(fp)
print(res)
except:
pass
json 和 pickle 两个模块的区别总结
(1) json序列化以后的数据类型是str ,全部编程语言都识别
可是仅限于(int float bool )(str list tuple dict None)
json不能连续load,只能一次性拿出来全部数据
(2)pickle序列化以后的呼声类型是bytes,
全部数据类型均可以转化,但仅限于python之间的存储传输
pickle能够连续load,多套数据放在同一个文件中