• Python序列化,json&pickle&shelve模块


    1. 序列化说明

      序列化可将非字符串的数据类型的数据进行存档,如字典、列表甚至是函数等等
      反序列化,将通过序列化保存的文件内容反序列化即可得到数据原本的样子,可直接使用

    2. Python中常用的序列化有json和pickle两种,区别如下

      json:只可序列化简单的数据类型,如字典、列表等,其他语言也有json,即json可跨语言进行序列和反序列化
      pickle:python独有的序列化,可序列化一切数据,以二进制的形式保存
      python中json和pickle的用法基本上是一模一样的

      注意:无论是json还是pickle,都只可序列化数据一次

    3. json&pickle序列化

    # -*- coding:utf-8 -*-
    # Author:Wong Du
    
    
    dict = {'name':'wong','age':'23'}
    # with open('test','w') as f:
    #     f.write(dict)
    ### 报错:TypeError: write() argument must be str, not dict
    
    
    '''
    ### 把字典用json序列化后写入文件
    ### json.dumps(obj); json.dump(obj, fp)
    ### f.write(json.dumps(dict)) == json.dump(dict,f)
    '''
    import json
    with open('test','w') as f:
        # f.write(json.dumps(dict))
        json.dump(dict,f)
    ### 成功写入
    
    '''pickle序列化'''
    import pickle
    def foo():
        print("In the foo...")
    foo()
    with open('test2','wb') as f:       #以二进制字节类型写入到文件当中,所以mode = 'wb'
        # f.write(pickle.dumps(foo))
        pickle.dump(foo,f)
    ### 写入成功!注意,这里的写入是把foo函数对象写入到文件当中,反序列化后,当代码里没有foo函数对象,则会报错
    
    
    list = [1,2,3,4,'name']
    with open('test3','wb') as f:
        # f.write(pickle.dumps(list))
        pickle.dump(list,f)

    4. json&pickle反序列化

    # -*- coding:utf-8 -*-
    # Author:Wong Du
    
    
    # with open('test','r') as f:
    #     print(f.read())
    #     f.read()['name']
    ### 报错:TypeError: string indices must be integers
    
    '''
    ### json反序列化读取文件内容,可直接获取到字典,进行元素调用
    ### json.loads(str); line = json.load(fp)
    ### line = json.loads(f.read()) == line = json.load(f)
    '''
    import json
    with open('test','r') as f:
        # line = json.loads(f.read())
        line = json.load(f)
        print(type(line))
        print(line['age'])
    ### 成功调用
    '''
    输出:
    <class 'dict'>
    23
    '''
    
    
    import pickle
    def foo():
        print("In the foo2...")
    with open('test2','rb') as f:       #以二进制字节类型读取文件内容,所以mode = 'rb'
        # line = pickle.loads(f.read())
        line = pickle.load(f)
        line()
    
    
    with open('test3','rb') as f:
        # line = pickle.loads(f.read())
        line = pickle.load(f)
        print(type(line))
        print(line[4])

     5. shelve模块序列化的使用

      shelve模块可序列化数据多次

    # -*- coding:utf-8 -*-
    # Author:Wong Du
    
    '''
    shelve模块可多次序列化并能简单的找到其中对应的数据
    即shelve模块以字典的形式进行k和v的关键字对应数据序列化
    '''
    
    import shelve
    
    dict = {'name':'wong','age':'23','sox':'man'}
    list = ['you','happy','jiu','OK']
    f1 = open('高并发socket_client.py')
    
    # 序列化数据
    with shelve.open('shelve.txt') as f:
        f['dict'] = dict
        f['list'] = list
        f['file'] = f1.read()
    
    # 调用shelve序列化的数据
    with shelve.open('shelve.txt') as f:
        print(f['dict'])
        print(f['dict']['name'])
        print(f['file'])

  • 相关阅读:
    常用排序算法--合并排序和快速排序
    常用排序算法--冒泡排序及改进和插入排序时间复杂度分析
    常用数据结构图--拓扑排序
    常用数据结构栈的应用—-表达式求值
    Session原理,生命周期
    jsp内置对象out 和response.getwriter().write()的区别
    div中的div在父容器中水平居中或者垂直居中
    <!DOCTYPE html> 到底是什么意思?
    设置了环境变量,为什么执行javac报找不到javac: 找不到文件
    自动抽取邮件内容
  • 原文地址:https://www.cnblogs.com/Caiyundo/p/9438166.html
Copyright © 2020-2023  润新知