Day15 pickle序列化和反序列化(能转换所有类型数据为字节流)、json模块(一般用于语言交流)

1.pickle 序列化模块

#dumps 把任意对象序列化成一个bytes
#loads 把任意bytes反序列化成原来数据
#dump 把对象序列化后写入到file-like Object(即文件对象)
#load 把file-like Object(即文件对象)中的内容拿出来,反序列化成原来数据

# python中任意数据类型都可以通过pickle就行转化成字节流字符串

1.1dumps 把任意对象序列化成一个bytes

# 导入pickle 模块  => 模块.方法()
import pickle

lst = [1,2,3,4,4,5]
res = pickle.dumps(lst)
print(res,type(res))
#b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04K\x04K\x05e.' <class 'bytes'>

 1.2把任意bytes反序列化成原来数据

res = pickle.loads(res)
print(res,type(res))
# [1, 2, 3, 4, 4, 5] <class 'list'>

# encode decode 能实现序列化么?
'''只有字符串可以使用encode或者decode ,容器类型数据等不可以.'''
# res = lst.encode("utf-8")
# print(res)

1.3# 对函数进行序列化

def func():
    print("我就是个姑娘,小燕子,赵薇,还珠格格")
    
func()
# 我就是个姑娘,小燕子,赵薇,还珠格格

# 序列化成字节流
res = pickle.dumps(func)
print(res)
# b'\x80\x03c__main__\nfunc\nq\x00.'

# 反序列化字节流 恢复原来的数据类型
res = pickle.loads(res)
print(res)
# <function func at 0x00000000004F1E18>
res()
# 我就是个姑娘,小燕子,赵薇,还珠格格

# pickle可以对所有的数据就行序列化

# 对迭代器进行序列化
it = iter(range(10))  
from collections import Iterator,Iterable
print(isinstance(it,Iterator))
# True
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模块进行序列化.

1.4

#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)
# <range_iterator object at 0x000000000221CB90>
for i in res:
    print(i)

# 0
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 小结:可以连续dump load

2.json

"""
json 模块能够转化的数据类型如下: int float bool str list tuple dict None 8个数据类型可以序列化
json数据类型的提出,是让不同的语言之间形成数据交流
pickle返回的是二进制的字节流,它是用来进行数据的传输和存储的.

json 序列化成一个字符串
pickle 序列化成一个字节流
"""
import json
# dumps 和 loads 是一对,用来序列化和反序列化的,在字符串和其他数据类型之间切换
dic = {'name':"黄文","age":8,"sex":"男性","family":['爸爸',"妈妈"]}
# 序列化
'''
ensure_ascii=True 如果想要显示中文ensure_ascii = False 
sort_keys=True 对字典的键进行排序(默认按照ascii 从小到大排序)
'''
res = json.dumps(dic, ensure_ascii=False,sort_keys=True)
print(res, type(res))
# {"age": 8, "family": ["爸爸", "妈妈"], "name": "黄文", "sex": "男性"} <class 'str'>
# 反序列化
res = json.loads(res)
print(res, type(res))
# {'age': 8, 'family': ['爸爸', '妈妈'], 'name': '黄文', 'sex': '男性'} <class 'dict'>
2.1dump 和 load 是一对, 用来进行数据的存储和提取
with open("ceshi001.json",mode="w",encoding="utf-8") as fp:
    json.dump(dic,fp,ensure_ascii=False)

with open("ceshi001.json",mode="r",encoding="utf-8") as fp:
    res = json.load(fp)
# {'name': '黄文', 'age': 8, 'sex': '男性', 'family': ['爸爸', '妈妈']} <class 'dict'>
print(res, type(res))

2.2json 和 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))
# {'a': 1, 'b': 2} <class 'dict'>
# {'a': 1, 'b': 2} <class 'dict'>
# pickle
'''
允许连续dump , 也允许连续load
'''
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
# {'a': 3, 'b': 4}
# {'a': 3, 'b': 4}
# {'a': 3, 'b': 4}
# {'a': 3, 'b': 4}
 总结:
# json 和 pickle 两个模块的区别:
(1)json序列化之后的数据类型是str,所有编程语言都识别,
   但是仅限于(int float bool)(str list tuple dict None)
   json不能连续load,只能一次性拿出所有数据
(2)pickle序列化之后的数据类型是bytes,
   所有数据类型都可转化,但仅限于python之间的存储传输.
   pickle可以连续load,多套数据放到同一个文件中
 
  
 
 
 
  
 

















猜你喜欢

转载自www.cnblogs.com/longerandergou/p/10959464.html