zoukankan      html  css  js  c++  java
  • 环境小硕的转行之路-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+'
    ')
         fa.write(dic_dump_write+'
    ')
    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专用的/支持几乎所有数据类型
    '''
    

      

  • 相关阅读:
    【洛谷4941】War2 状压Dp
    洛谷4623 [COCI2012-2013#6] BUREK
    洛谷1099 [NOIP2007] 树网的核
    【Jim】I am back (ง •_•)ง
    发个ZKW线段树板子测试一下代码高亮
    洛谷2764 最小路径覆盖问题
    洛谷1972 [SDOI2009]HH的项链
    bzoj1059 [ZJOI2007]矩阵游戏
    知识点整理--组合数学
    最大矩形问题总结
  • 原文地址:https://www.cnblogs.com/negu/p/11732834.html
Copyright © 2011-2022 走看看