序列化模块 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 picklelst = [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 把任意对象序列化为byteslst = {\"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 jsondic = {\'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)loadwith 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)