环境小硕的转行之路-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专用的/支持几乎所有数据类型
'''

  

posted @ 2019-10-24 16:14  negu  阅读(126)  评论(0编辑  收藏  举报