环境小硕的转行之路-21-序列化
序列化的定义
序列:列表 元组 字符串 bytes.
序列化里面的序列特指的就是字符串和bytes.
把其它的数据类型转换成字符串和bytes的过程就是序列化的过程.
直接序列化的一个例子:
dic = {'1':'2'} print([str(dic),dic])#序列化
json模块
主要内容
import json ''' 为什么要把其它数据类型转换成字符串? 转字符串的过程不就是数据类型的强制转换吗?为啥要学json和pickle模块呢? 网络上只能传输的是bytes类型. 存储在文件里只是bytes和str(本质是bytes) 最好的传输模式:字典->字符串->通过网络传输->字典->字符串 eval要谨慎使用:不可以用在:a.用户输入的b.网络上接收的数据c.文件中的内容 正常人不会用eval作序列化,但已知的代码但需要y一些拼接,根据自己的逻辑去做拼接. 所以要有序列化模块 ''' dic = {'key':'value1','key2':'value2'} import json ret = json.dumps(dic)#序列化 print(dic,type(dic))#{'key': 'value1', 'key2': 'value2'} <class 'dict'> # print(ret,type(ret))#{"key": "value1", "key2": "value2"} <class 'str'> res = json.loads(ret) print(res,type(res))#可以直接使用,反序列化 # json.loads() #问题1 dic1 = {1:'value1',2:'value2'} ret1 = json.dumps(dic1) print(1,json.loads(ret1),type(json.loads(ret1)))#将1和2也变成了字符串 #问题2 dic2 = {1:[1,2,3],2:(4,5,6)} ret2 = json.dumps(dic2) print(2,json.loads(ret2),type(json.loads(ret2)))#(4,5,6)变成了[4,5,6] #问题3 # set3 = {1,2,'aa'} # json.dumps(set3)#{1, 2, 'aa'} is not JSON serializable #问题4 #keys must be a string # json.dumps({(1,2,3):123})#keys must be a string #json能够处理的数据类型是非常有限的,只支持字符串,列表,字典,数字.json序列化的数据在各种数据中都可以反序列化.因为要和别的语言通讯. # 字典中的key只能是字符串 # 别的语言的例子->前端语言:在网页上做展示的 但本质上都是数据传输 #向文件当中记录字典,再从文件中读取字典ok. #问题5 retp = json.dumps(dic) with open('dic.dump','a',encoding='utf-8') as f:#一般是a而不是a+ # f.write(retp)#可以用json(dic,f)替换 with open('dic.dump','r',encoding='utf-8') as fr: retr = fr.read()#这里自己添加的话,必须用双引号去表示字符串,#可以用 dic = json.load(fr)替换 # dict = json.loads(retr) # print(dic.keys()) #dump load 直接操作文件,dumps和loads直接操作内存(针对数据) #可以多次将数据dump进文件,而不能多次load数据(只能load一个变量),计算机不识别. #不支持连续的存和取的,这时候只能用dumps和loads来实现这功能 # with open('dic.dump','r') as five_file: # dic_5 = json.load(five_file) # dic_5 = json.load(five_file)#报错 #想要把一个个的字典放到文件中再一个个拿出来怎么办? #解决方法,+分隔符再一行一行的读取数据,(用dumps和loads来执行) with open('dic.dump','a') as fa: dic_dump_write = json.dumps(dic2) fa.write(dic_dump_write+'\n') fa.write(dic_dump_write+'\n') with open('dic.dump', 'r') as fr1: for line in fr1: json.loads(line) json.loads(line)
小结
''' json dumps loads->针对数据 在内存中做数据转换: dumps 数据类型转换成字符串 序列化 loads 字符串转成数据类型 反序列化 dump load->针对文件 直接将数据类型写入文件 从文件中读出数据列席 json 是所有语言都通用的一种序列化格式 只支持列表,字典,字符串,数字 字典的key必须是str '''
补充
dic_test = {1:'无敌'} print(json.dumps(dic_test,ensure_ascii=False))#不然'无敌'是编码形式显示 import json data = {'username':['李华','二愣子'],'sex':'male','age':16} #格式化序列化 json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=(',',':'),ensure_ascii=False)#indent缩进数 seperator('换行分割符','key和value分割符'),sort_keys:根据key去排序 print(json_dic2) ''' 结果: { "age":16, "sex":"male", "username":[ "李华", "二愣子" ] } ''' #一般情况下要存文件,从网络上传,都不关心这些格式了.若是格式化容易增加空间开销.
pickle模块
主要内容
import pickle #支持在python中几乎所有的数据类型 dic = {(1,2,3):{'a':'b'},1:'abc'}#json模块无法处理 dic1 = {(1,2,3):{'a':'b'},2:'abc'}#json模块无法处理 dic2 = {(1,2,3):{'a':'b'},3:'abc'}#json模块无法处理 ret = pickle.dumps(dic) print(ret)#bytes类型 #1.pickle dumps的结果永远是字节,看不见结果,且无法解码. print(pickle.loads(ret)) #2.只有pickle.loads可以认识这些字节 #3.只能在python中使用 #4.在和文件操作的时候,要用wb,rb的模式打开文件. #dump load # with open('pickle_file','wb') as pickle_open: # pickle.dump(dic,pickle_open) # pickle.dump(dic1,pickle_open) # pickle.dump(dic2,pickle_open) # with open('pickle_file','rb') as pickle_open: # ret1 = pickle.load(pickle_open) # print(ret1,type(ret1))#{1: 'abc', (1, 2, 3): {'a': 'b'}} <class 'dict'> # ret1 = pickle.load(pickle_open) # print(ret1,type(ret1))#{2: 'abc', (1, 2, 3): {'a': 'b'}} <class 'dict'> #可以多次load,对应上次dump的次数.若是load次数超过dump次数则报错. #报错的解决方法 with open('pickle_file','rb') as pickle_open: while 1 : try: ret1 = pickle.load(pickle_open) print(ret1,type(ret1)) except EOFError: break
大结
''' os 和操作系统交互 文件夹和文件的处理 :创建文件夹 删除文件夹 重命名文件 删除文件 listdir stat 路径的处理 : 路径的拼接/拆分 计算大小 判断目录是否存在/是文件/是文件夹 绝对路径相关 执行操作系统命令 : 和执行路径相关 执行命令的 序列化模块 json/pickle dump/load 文件中 <-> 其他数据类型 文件中 <-> 字符串/字节 <-> 其他数据类型 dumps/loads 字符串/字节 <-> 其他数据类型 json 通用的/支持的数据类型少 pickle python专用的/支持几乎所有数据类型 '''