zoukankan      html  css  js  c++  java
  • day6_python之pickle、shelve序列化和反序列化

    pickle、shelve,python私有,支持所有python数据类型

    一、pickle

    dic={'name':'egon','age':18}
    
    print(pickle.dumps(dic))    ##得到的是一个bets类型数据
    
    with open('d.pickle','wb') as f:      #bets类型需要用wb模式打开
        f.write(pickle.dumps(dic))        #序列化
    
    
    ##反序列化
    with open('d.pickle','rb') as f:      #bets类型需要用b模式打开
        data=pickle.loads(f.read())
        print(data['name'])    

    简单版本: 

    
    
    ##1、第一步
    dic = {'name': 'egon', 'age': 18}
    pickle.dump(dic, open('e.pickle', 'wb'))
    
    ##第二步,可以在其它py程序中实现反序列化
    data = pickle.load(open('e.pickle', 'rb'))
    print(data['name'])
    
    
    
    用json来序列化函数?
    def func():
        print('from func')
    
    import  json
    
    json.dump(open('s.json','w'))
    
    
    注意报错:说,函数不是一个json可序列化的对象
    用plckle来序列化函数?
    
    
    def func():
        print('from func')
    
    import pickle
    
    print(pickle.dumps(func))   #b'x80x03c__main__
    func
    qx00.'   :pickle可以序列化函数
    
    pickle.dump(func,open('func.pickle','wb'))     #序列化函数
    
    ###然后去 pickle_反序列化.py文件里把函数反序列化出来
    
    
    

     

    报错AttributeError: Can't get attribute 'func' on <module '__main__' from 
    'D:/python-笔记/day5/pickle_module/pickle_反序列化.py'>

    注意:序列化的时候是序列化的内存地址,没有把函数的值序列化进去,如果反序列化的时候找不到内存地址,会报错。

     

    序列化类


    # class Foo:
    # pass
    #
    #
    # obj1=Foo()
    # obj2=Foo()
    #
    # #### print(obj1 is obj2) #False
    # #### 需求:把两个对象保存下来
    #
    # pickle.dump(obj1,open('class_obj1.pickle','wb'))
    # pickle.dump(obj2,open('class_obj2.pickle','wb')) #成功序列化类

    问题来了,反序列化怎么做,把上面的class Foo,obj1=Foo()obj2=Foo() 全部注释掉

    import pickle

    pickle.load(open('class_obj1.pickle','rb')) #报错,因为Foo不存在了,无法反序列化

    二、shelve

    1、shelve_模块从文件中取数据

    import shelve
    
    obj=shelve.open(r'sheve.shl')    #取数据的时候只需要记住文件名,打开这个文件会得到一个对象,赋值给obj
    print(obj['xiechao'])
    print(obj['wangyanli'])
    
    
    
    
    for i in obj:
        print(i,obj[i])    #得出来的是字典的k,v
    
    
    
    obj.close()    #最后别忘记了关闭
    

    二、shelve_模块保存数据到文件

    shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式

    注意:shelve只支持python ,不能跨平台

    import shelve
    
    f = shelve.open(r'sheve.shl')  #可以写一个文件路径
    
    ##需要把谢超的信息永久存放下来
    
    f['xiechao']={'age':18,'pwd':'0621'}
    f['wangyanli']={'age':22,'pwd':'0621'}
    f['zhujingjing']={'age':34,'pwd':'0621'}
    f['jingjingzhu']={'age':44,'pwd':'0621'}
    f['jingjingZH']={'age':43,'pwd':'0621'}     #写完直接自动保存到文件里去了
    
    f.close()
    

     shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象,可读可写;key必须为字符串,而值可以是python所支持的数据类型  

    import shelve
    
    f=shelve.open(r'sheve.txt')
    # f['stu1_info']={'name':'egon','age':18,'hobby':['piao','smoking','drinking']}
    # f['stu2_info']={'name':'gangdan','age':53}
    # f['school_info']={'website':'http://www.pypy.org','city':'beijing'}
    
    print(f['stu1_info']['hobby'])
    f.close()
    

      

      

  • 相关阅读:
    修改element ui 默认样式最好的解释
    python全栈开发day92-day96 Vue总结
    跨域资源共享 CORS 详解(转自阮一峰博客)
    Vue axios 返回数据绑定到vue对象问题
    Vue爬坑之路
    input标签checkbox选中触发事件的方法
    python中super的理解(转)
    Django时区的解释
    django 视图函数返回queryset对象或日期对象至浏览器ajax接收的写法
    python全栈开发day87~91-整个流程梳理、CRM功能、知识点梳理
  • 原文地址:https://www.cnblogs.com/xiechao621/p/7887648.html
Copyright © 2011-2022 走看看