序列化模块
一. 序列化模块json
把其他的数据类型 转换成 字符串 bytes 是序列化的过程
能存在文件和在网上传输的只能是bytes, 所以要转化成字符串
json模块只支持字符串, 字典(key不能是数字, 数字会变成字符串), 列表, 数字
json的对象不能含有元组, 集合, 字典的键不能是数字, 键如果是元组会直接报错
文件中读出来的, 网络上接收来的不能直接运行, 会有恶意代码
json在所有的语言之间都通用, 包括后端语言 java c c++ c# 和前端语言
json能够处理的数据类型非常有限
dic = {'key' : 'value','key2' : 'value2'} import json ret = json.dumps(dic) # 序列化 print(ret) res = json.loads(ret) # 反序列化 print(res) 向文件中记录字典 import json dic = {'key' : 'value','key2' : 'value2'} ret = json.dumps(dic) with open('json_file','a') as f: f.write(ret) 从文件中读取字典 with open('json_file','r') as f: str_dic = f.read() dic = json.loads(str_dic) print(dic.items()) dump load 是直接操作文件的 dic = {'key1' : 'value1','key2' : 'value2'} with open('json_file','a') as f: json.dump(dic,f) with open('json_file','r') as f: dic = json.load(f) print(dic.items()) json不支持连续存取, 需要一个个加上换行符放进文件中, 再一个个地取出来 dic = {'key1' : 'value1','key2' : 'value2'} with open('json_file','a') as f: str_dic = json.dumps(dic) f.write(str_dic+'\n') str_dic = json.dumps(dic) f.write(str_dic + '\n') str_dic = json.dumps(dic) f.write(str_dic + '\n') with open('json_file','r') as f: for line in f: dic = json.loads(line.strip()) print(dic.keys()) dumps loads 在内存中做数据转换 : dumps 数据类型 转成 字符串 序列化 loads 字符串 转成 数据类型 反序列化 dump load 直接将数据类型写入文件,直接从文件中读出数据类型 dump 数据类型 写入 文件 序列化 load 文件 读出 数据类型 反序列化 dic = {'key':'你好'} print(json.dumps(dic,ensure_ascii=False)) # 没有ensure_ascii会输出{"key": "\u4f60\u597d"} import json data = {'username':['李华','二愣子'],'sex':'male','age':16} json_dic2 = json.dumps(data,sort_keys=True,indent=4,separators=(',',':'),ensure_ascii=False) # 按键排列, 按,和:换行, 换行时空4个空格 print(json_dic2)
二. 序列化模块pickle
支持在python中几乎所有的数据类型
只能在python中使用, dumps 序列化的结果只能是字节, 而且不是utf-8或者unicode等格式的字节, 只有Python能解码
在和文件操作的时候,需要用rb wb的模式打开文件
可以多次dump和多次load
import pickle dic = {(1,2,3):{'a','b'},1:'abc'} ret = pickle.dumps(dic) print(ret) print(pickle.loads(ret)) dump with open('pickle_file','wb') as f: pickle.dump(dic,f) load with open('pickle_file','rb') as f: ret = pickle.load(f) print(ret,type(ret)) dic = {(1,2,3):{'a','b'},1:'abc'} dic1 = {(1,2,3):{'a','b'},2:'abc'} dic2 = {(1,2,3):{'a','b'},3:'abc'} dic3 = {(1,2,3):{'a','b'},4:'abc'} with open('pickle_file','wb') as f: pickle.dump(dic, f) pickle.dump(dic1, f) pickle.dump(dic2, f) pickle.dump(dic3, f) with open('pickle_file','rb') as f: ret = pickle.load(f) print(ret) ret = pickle.load(f) print(ret) ret = pickle.load(f) print(ret) ret = pickle.load(f) print(ret) with open('pickle_file','rb') as f: while True: try: ret = pickle.load(f) print(ret,type(ret)) except EOFError: # 报错时, 用except break