序列化模块 pickle / json
pickle
序列化: 将不能直接存储的数据变的可存储,这个过程叫做序列化
反序列化: 将文件中的数据拿出来,回复成原来的数据类型,这个过程叫做反序列化
在文件中存储的只能是字符串和字节流.不能是其他数据
错误示例:
lst = [a,b,c]
with open("1.txt","w",encoding="utf-8") as fp:
fp.write(lst) # error lst 为列表
pickle的使用
# dump 把对象序列化后写入到文件中 (必须为wb模式)
import pickle
lst = [a,b,c]
with open("1.txt","wb") as fp:
pickle.dump(lst,fp)
# load 把文件对象中的内容拿出来,反序列化为原来的类型
with open("test01.txt","rb") as fp:
res = pickle.load(fp)
print(res)
# dumps 把任意对象序列化为bytes
lst = {"a":1,"b":2}
res = pickle.dumps(lst)
print(res) # b'\x80\x03}q\x00(X\x01\x00\x00\x00aq\x01K\x01X\x01\x00\x00\x00bq\x02K\x02u.'
# loads 把任意bytes反序列化为原来的数据
lst = pickle.loads(res)
print(lst) # {'a': 1, 'b': 2}
json模块
json模块 (将不能存储的数据序列化变得可存储)
反序列化: 把文件中的数据拿出来,恢复成原来的数据类型,这个过程叫做反序列。
与pickle模块的区别:
(1)pickle可以读取所有数据类型
json 不可以读取 complex,set(如php中没有这两种数据类型)
(2)所有的编程语言都能识别json,应用广泛
(3) pickle 序列化存储的是字节流,只能在Python之间存储
json序列化后的数据类型是字符串,所有的编程语言都能识别
(4) pickle 可以连续dump 也可以连续load,因为[pickle在存储的时候会在末尾加上结束符,多套数据放到同一个文件中
(5) json可以连续dump 不可以连续load 只能一次性load(全部反序列化出来)
(6)json适合用来交流,pickle适合用来存储
json用法
(1)dumps 将数据序列化为字符串
import json
dic = {'a':1,'b':2}
res = json.dumps(dic,ensure_ascii=False,sort_keys=True)
# ensure_ascii=False 显示中文 sort_keys=True 对字典的键进行排序
print(res,type(res)) # {"a": 1, "b": 2} <class 'str'>
(2) loads 反序列化为原来的类型
dic = json.loads(res)
print(dic,type(dic)) # {'a': 1, 'b': 2} <class 'dict'>
(1)dump 将数据序列化后存储到文件 (存储为字符串)
dic = {'a':1,'b':2,'c':"咦嘻"}
with open('test1.txt','w',encoding='utf-8') as fp:
json.dump(dic,fp,ensure_ascii=True) # {"a": 1, "b": 2, "c": "\u54a6\u563b"}
# ensure_ascii 为True则按ascii码存储,若要显示中文应改为False
(2)load
with open("tese1.txt",mode="r",encoding="utf-8") as fp:
dic = json.load(fp)
print(dic)
针对于json不能连续load的问题
# 解决方法
with open('1.txt','r',encoding='utf-8') as fp:
for i in fp:
dic = json.loads(fp)
print(dic)