zoukankan      html  css  js  c++  java
  • 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'])

  • 相关阅读:
    Blank page instead of the SharePoint Central Administration site
    BizTalk 2010 BAM Configure
    Use ODBA with Visio 2007
    Handling SOAP Exceptions in BizTalk Orchestrations
    BizTalk与WebMethods之间的EDI交换
    Append messages in BizTalk
    FTP protocol commands
    Using Dynamic Maps in BizTalk(From CodeProject)
    Synchronous To Asynchronous Flows Without An Orchestration的简单实现
    WSE3 and "Action for ultimate recipient is required but not present in the message."
  • 原文地址:https://www.cnblogs.com/Caiyundo/p/9438166.html
Copyright © 2011-2022 走看看