• 序列化模块


     

    模块: 一个py文件就是一个模块.
    python开发效率之高:Python的模块非常多,第三方库.
    模块分类:
    1,内置模块:登录模块,时间模块,sys模块,os模块 等等.
    2,扩展模块. itchat 微信有关.爬虫: beautifulsoup
        所有的扩展模块:https://pypi.org/
    3,自定义模块.自己写的py文件.
    序列化模块.
    序列化:创造一个序列.
    实例化:创造一个实例(对象).
    将一个字典通过网络传输给另一个人.
    
    文件中可以存储:字符串,和bytes.
    数据的传输:bytes类型.
    什么是序列化:
    将数据转化成序列化字符串的过程
    
    
    下面的解决方式不好! eval极度不安全.
    dic = {'alex':['women','women','oldwomen']}
    ret = str(dic)
    # print(ret,type(ret))
    b1 = ret.encode('utf-8')
    s1 = b1.decode('utf-8')  # "{'alex':['women','women','oldwomen']}"
    dic1 = eval(s1)
    print(dic1,type(dic1)
    View Code
    那怎么解决?
    序列化: 创造一个序列, ---> 特殊处理(序列化的)字符串.
    序列化:
            json:
                    适用于不同语言之间的,
                    但是可支持的数据类型:字符串,数字,列表,字典  bool待定。
            pickle:
                只用于python语言之间的.
                可支持python所有的数据类型.
            shelve(了解):只是python,小工具(文件方面).
    
    json:
    数据通过网络发送给别人. json
    写入文件 也用到json.
    
    序列化过程: 一个数据类型 ---> 序列化的字符串
    反序列化过程: 序列化的字符串  --->  它所对应的数据类型
    
    Json模块提供了四个功能:dumps、dump、loads、load
    json 模块:
    两对:
    dumps  loads
    dump  load
    dumps  loads 网络的传输
    dic = {"alex": ['women','women','老女人'],'p1':True}
    dic = {"alex": ('women','women','老女人')}
    print(str(dic))  # 基础数据类型str  里面如果有引号就是单引号
    ret = json.dumps(dic,ensure_ascii=False) # 序列化过程:数据类型dic---> 序列化的字符串
    print(ret,type(ret))
    被json序列化的字符串:
    1,可以直接通过网络互相传输.
    2,可以在各个语言中通用.
    dic1 = json.loads(ret)  # 反序列化过程.:将序列化的字符串---> 原有的数据类型.
    print(dic1,type(dic1))
    View Code
    被json序列化的字符串:
    1,可以直接通过网络互相传输.
    2,可以在各个语言中通用.
    序列化过程:数据类型dic---> 序列化的字符串 反序列化过程.:将序列化的字符串---> 原有的数据类型.
    import json
    dic = {'k1':'v1','k2':'v2','k3':'v3'}
    str_dic = json.dumps(dic)  #序列化:将一个字典转换成一个字符串
    print(type(str_dic),str_dic)  #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"}
    #注意,json转换完的字符串类型的字典中的字符串是由""表示的
    
    dic2 = json.loads(str_dic)  #反序列化:将一个字符串格式的字典转换成一个字典
    #注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
    print(type(dic2),dic2)  #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
    
    list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}]
    str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型 
    print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
    list_dic2 = json.loads(str_dic)
    print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]
    View Code
    dump load 有关文件存储:
    import json
    l1 = ['张三','历史','王五','alex','老土','旭哥']
    f = open('json_file',encoding='utf-8',mode='w')
    json.dump(l1,f,ensure_ascii=False)  # 将序列化的字符串存储到文件中
    f.close()
    
    f = open('json_file',encoding='utf-8')
    ret = json.load(f)
    print(ret,type(ret))
    f.close()
    View Code
    import json
    f = open('json_file','w')
    dic = {'k1':'v1','k2':'v2','k3':'v3'}
    json.dump(dic,f)  #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
    f.close()
    
    f = open('json_file')
    dic2 = json.load(f)  #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
    f.close()
    print(type(dic2),dic2)
    View Code
    有关文件存储的问题?
    将多个序列化的字符串写入文件,然后反序列化,就会出错
    用 dump load 只能写入和读取文件 一个序列化的字符串
    下面的是错误的,没有换行符
    f = open('json_files',encoding='utf-8',mode='w')
    json.dump(dic,f,ensure_ascii=False)
    json.dump(dic2,f,ensure_ascii=False)
    json.dump(dic3,f,ensure_ascii=False)
    f.close()
    f = open('json_files', encoding='utf-8',)
    print(json.load(f))
    print(json.load(f))
    print(json.load(f))
    f.close()
    View Code
    多个数据读写一个文件的应用:
    dic = {"alex": ('women','women','老女人')}
    dic2 = {"alex1": ('women','women','老女人')}
    dic3 = {"alex2": ('women','women','老女人')}
    
    with open('json_files',encoding='utf-8',mode='a') as f1:
        s1 = json.dumps(dic,ensure_ascii=False)
        f1.write(s1+'
    ')
        s2 = json.dumps(dic2,ensure_ascii=False)
        f1.write(s2+'
    ')
        s3 = json.dumps(dic3,ensure_ascii=False)
        f1.write(s3+'
    ')
    
    with open('json_files',encoding='utf-8') as f2:
        for line in f2:
            dic = json.loads(line)
            print(dic,type(dic))
    
    dic = {"alex": ('women','women','老女人')}
    ret = "
    "+json.dumps(dic)
    print(ret)
    View Code
    其他参数:
    json的格式化输出:
    import json
    data = {'username':['李华','二愣子'],'sex':'male','age':16,'A':666}
    json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=(',',':'),ensure_ascii=False)
    print(json_dic2)
    
    print(json.loads(json_dic2)) # 如果改了:separators=('|','*')反序列化不行了
    sort_keys=True 字典键的首字母的ascii码排序
    ensure_ascii=False 显示中文
    indent=2 key 缩进
    
    dic = {(1,2,3):'alex',1:[1,2,3]}
    ret = json.dumps(dic)
    print(ret)  # TypeError: keys must be a string
    View Code
    
    
    python 可以json序列化的数据类型有:dict,list,tuple,str,int,float,bool,None
    json字符串,和python str 到底差在什么地方?
    
    
    json 字符串 在数据最外面始终是单引号引起来的.
    '{"name": "taibai"}'
    json 字符串 如果数据是容器类的数据类型,且里面有字符串,则字符串一定双引号.
    '{"name": "taibai"}'
    而 python的是 "{'name': 'taibai'}"
    对于单独的字符串:
    python 显示:  'alex'
    json 显示是  '"alex"'
    额外:
    ss = 'alex'
    print(json.loads(ss))
    ss1 = '"alex"'
    print(json.loads(ss1))
    i = '1'
    print(json.loads(i),type(json.loads(i)))
    思考题? 如果直接在文件中写一个 "alex"
    我要是用load 可不可以?
    
    pickle
    class A :
         def __init__(self,name,age):
             self.name = name
             self.age = age
    
    a1 = A('alex',1000)
    import pickle
    
    游戏的存档,读挡
    with open('存储对象',mode='wb') as f1:
        pickle.dump(a1,f1)
    with open('存储对象',mode='rb') as f1:
        ret = pickle.load(f1)
    print(ret)
    print(ret.name)
    区别
    pickle   模块:
    用于序列化的两个模块
    json,用于字符串 和 python数据类型间进行转换
    pickle,用于python特有的类型 和 python的数据类型间进行转换
    pickle模块提供了四个功能:dumps、dump(序列化,存)、loads(反序列化,读)、load  (不仅可以序列化字典,列表...可以把python中任意的数据类型序列化)
    pickle 序列化模块,python语言网络交互使用的,他支持所有的python数据类型.
    两对 四个方法
    dumps  loads  网络传输:
    dic = {1:True,(2,3):[1,2,3,4],False:{1,2,3}}
    import pickle
    ret = pickle.dumps(dic)  # bytes类型无法识别内容
    
    dic1 = pickle.loads(ret)
    print(dic1,type(dic1))
    View Code
    dump  load 文件操作:
    dic = {1:True,(2,3):[1,2,3,4],False:{1,2,3}}
    
    import pickle
    with open('pickle_file',mode='wb') as f1:
        pickle.dump(dic,f1)
    
    with open('pickle_file',mode='rb') as f2:
        print(pickle.load(f2))
    View Code
    多个数据存储到一个文件:
    dic = {"alex": ('women','women','老女人')}
    dic2 = {"alex1": ('women','women','老女人')}
    dic3 = {"alex2": ('women','women','老女人')}
    
    import pickle
    with open('pickle_files',mode='wb') as f1:
        pickle.dump(dic,f1)
        pickle.dump(dic2,f1)
        pickle.dump(dic3,f1)
        pickle.dump(dic3,f1)
    
    
    with open('pickle_files',mode='rb') as f1:
        while True:
            try:
                print(pickle.load(f1))
            except EOFError:
                break
    View Code
    shelve模块:
    shelve  与文件相关.:
    import shelve
    f = shelve.open('shelve_file')
    f['key'] = {'int':10, 'float':9.5, 'string':'Sample data'}  #直接对文件句柄操作,就可以存入数据
    f.close()
    
    import shelve
    f1 = shelve.open('shelve_file')
    existing = f1['key']  #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错
    f1.close()
    print(existing)
    View Code
    import shelve
    f = shelve.open('shelve_file', flag='r')
    # existing = f['key']
    f['key'] = [11,22,33]
    f.close()
    # print(existing)
    
    f = shelve.open('shelve_file', flag='r')
    ex = f['key']
    print(ex)
    f.close()
    
    f['key'] = {'int':10, 'float':9.5, 'string':'Sample data','new_value': 'this was not here before'}
    import shelve
    f1 = shelve.open('shelve_file')
    print(f1['key'])
    f1['key']['new_value'] = 'this was not here before'
    print(f1['key'])
    f1.close()
    
    f2 = shelve.open('shelve_file',writeback=True)
    print(f2['key'])
    f2['key']['new_value'] = 'this was not here before'
    print(f2['key'])
    f2.close()
    
    import shelve
    f1 = shelve.open('shelve_file')
    f1['key'] = {'int':10, 'float':9.5, 'string':'Sample data'}
    print(f1['key'])
    f1.close()
    添加了一个键值对,主要是添加了一个值 {'int':10, 'float':9.5, 'string':'Sample data'}
    View Code
    总结:
    序列化模块:
    为了将数据用于网络传输
    文件的读写操作
    序列化:将数据转化成序列化字符串
    反序列化:将序列化字符串转化成原数据
    json:
    优点;不同语言的数据传输
    缺点:只支持str,int,list,dict,bool,float,None,tuple
    老男孩官网 有微信支付功能.
    两对 四个方法:
    dumps  loads: 用于网络传输,多个数据读写一个文件.
    import json
    dic1 = {'name':'alex'}
    s1 = json.dumps(dic1)  序列化过程
    dic = json.loads(s1)  反序列化过程
    dump load: 单个数据读写一个文件.
    多个数据读写一个文件的应用:
    代码 02 序列化模块.py中
    其他参数...
    pickle:
    优点:支持python所有的数据类型
    缺点:只能在python语言中进行数据传输
    两对 四个方法:
    dumps  loads: 用于网络传输,多个数据读写一个文件.
    import pickle
    dic1 = {'name':'alex'}
    s1 = pickle.dumps(dic1)  序列化过程
    dic = pickle.loads(s1)  反序列化过程
    dump load: 单个数据读写一个文件.
    多个数据读写一个文件的应用:
    代码 02 序列化模块.py中
    循环,try ....
    shelve:pass(了解.)
    
    序列化模块:
    用于序列化的两个模块
     json,用于字符串 和 python数据类型间进行转换
    pickle,用于python特有的类型 和 python的数据类型间进行转换
     pickle模块提供了四个功能:dumps、dump(序列化,存)、loads(反序列化,读)、load  (不仅可以序列化字典,列表...可以把python中任意的数据类型序列化)
    支持所有数据类型只在python语言中流通
    序列:有序的排列  (列表 元组  字符串  bytes)
    序列化:
    字符串
    将普通的数据类型转换成字符串/bytes的过程
    数据结构?
    容器类型
    为什么要用序列化呢?
    要固态的存储一个数据结构
    要在网络上传输一个数据结构
    import json
    # 序列化 dict/list---> str
    dic = {'k':'v'}   #dic
    print(dic,type(dic))
    print(json.dumps(dic))   #json
    ret = json.dumps(dic)
    print(ret,type(ret))   #str
    # 反序列化  str--->dict/list
    res = json.loads(ret)
    print(res,type(res))
    import json
    lst = [1,2,3]  #list
    print(lst,type(lst))
    ret = json.dumps(lst)
    print(ret,type(ret))
    反序列化  str---> dict/list
    res = json.loads(ret)
    print(res,type(res))
    View Code
    import json
    tup = (1,2,3)
    print(tup,type(tup))
    ret = json.dumps(tup)
    print(ret,type(ret))
    反序列化, str--->dict/list
    res = json.loads(ret)
    print(res,type(res))
    
    import json    #报错。
    se = {1,2,3}    #集合的对象不是JSON序列化
    print(se,type(se))
    ret = json.dumps(se)
    print(ret,type(ret))
    #反序列化 str--->dict/list
    res = json.loads(ret)
    print(res,type(res))
    java js-->json
    View Code
    所有的语言都通用的一种数据结构
    数字  字符串  列表  字典
    元组和list非常像
    元组是作为一个列表被序列化的,所以在转回来的过程中也只能转换成一个列表
    json
    其他特定的数据类型-->str 序列化  dumps
    str-->其他特定的数据类型  反序列化 loads
    import json
    dic = {'k':'v'}
    ret = json.dumps(dic)
    with open('json_demo','w')as f:
        f.write(ret)
    with open('json_demo')as f:
        str_dic = f.read()
    d = json.loads(str_dic)
    print(d)
    
    dic = {'k':'v'}
    with open('json_demo2','w')as f:json.dumps(dic,f)
    with open('json_demo2')as f:print(json.load(f))
    View Code
    dumps / loads 内存中 数据类型<-->str
    dump / load 文件和内存之间  数据类型<-->str
    json的问题
    {1:'v'}-->str -->{'1':'v'} json 的key必须是一个字符串
    有限的数据类型  数字 字符串 元组 列表 字典
    不能连续的load
    三个模块
    json:
    json  所有语言通用
    支持的数据类型很少:str lst dict tuple {}的key必须是str
    json的结果可以看懂
    pickle:
    pickle —— 只能python
    几乎可以处理所有的数据类型只在python语言中流通
    pickle的结果bytes
    可以连续向文件中dump或load
    json & pickle:
    dum/load  --> 和文件打交道
    json 不能连续load
    pickle 可以多次dump,连续load
    dumps/loads -->和内存打交道
    shelve :
    shelve —— 简单 不全面
    obj = open()
    obj['key'] = {' '}
    obj.close()
    import pickle#能够处理所有数据类型 只能在python中使用
    dic = {'k':'v',(1,2,3):{'a','b','c'}}
    res = pickle.dumps(dic)
    print(res)     #bytes类型
    d = pickle.loads(res)
    print(d)#{'k': 'v', (1, 2, 3): {'b', 'a', 'c'}}
    import pickle
    dic = {'k':'v',(1,2,3):{'a','b','c'}}
    with open('pickle_demo1','wb')as f:
        pickle.dump(dic,f)
        pickle.dump(dic,f)
        pickle.dump(dic, f)
    with open('pickle_demo1','rb') as f:
         d = pickle.load(f)
         print(d)
         d = pickle.load(f)
         print(d)
         d = pickle.load(f)
         print(d)
    
    
    import shelve
    f = shelve.open('shelve_file')
    f['key'] = {'int':10,'float':9.5,'string':'Sample data'}
    f.close()
    f1 = shelve.open('shelve_file')
    existing = f1['key'] #
    f1.close()
    print(existing)
    View Code
  • 相关阅读:
    Java学习第十五章 之 Map、可变参数、Collections
    Java第十四章 之 List、Set
    Java学习第十三章 之 常用API
    通过shell终端上传下载文件
    javamail邮件发送
    linux防火墙添加例外端口shell脚本
    MySQL批量更新
    MySQL返回列名
    发现一个有意思的东西
    struts2,action方法自动执行两次
  • 原文地址:https://www.cnblogs.com/ls13691357174/p/9270477.html
Copyright © 2020-2023  润新知