zoukankan      html  css  js  c++  java
  • python模块之pickle、shelve、json

    一 什么是序列化

    序列化指的是将内存中的数据结构转化为一种中间格式,并存储到硬盘上。

    (反序列化:将硬盘上存储的中间格式数据再还原为内存中的数据结构)

    二 为什么要序列化

    1. 持久保持状态

    需知一个软件/程序的运行就是处理一系列状态的变化,在编程语言中,‘状态‘会以各种有结构的数据类型(也可以称之为变量)的形式保存在内存中。

    内存是无法永久保存数据的,当程序运行了一段时间,我们断电或者重启程序,内存中关于这个程序之前一段时间的数据都会被清空。

    在断电或重启程序之前将程序当前运行的数据保存下来,便于下次程序执行能够从文件中载入之前的数据,然后继续执行,这就是序列化。

    1. 数据跨平台交互

    序列化数据之后,不仅可以把序列化后的内容写入硬盘,还可以通过网络传输到别的机器上,如果收发的双方约定都使用一种序列化的格式,那么便打破了平台和语言带来的限制,实现了跨平台交互。

    反过来,把变量内从从序列化的对象重新读到内存里称之为反序列化,即unpicking。

    三 序列化数据的三个模块

    一 pickle模块

    pickle模块时python内置的用来序列化python数据格式的模块,支持序列化python中所有的数据类型,主要方法有四个;

    1. dumps
    import pickle
    name = 'musibii'
    age = 18
    height = 1.7
    user = {'name': name, 'age': age, 'height': height}
    with open('userinfo.pkl', 'wb') as f:
        userbytes = pickle.dumps(user)
        f.write(userbytes)
    
    1. loads
    import pickle
    with open('userinfo.pkl', 'rb') as f:
        userbytes = f.read()
        user = pickle.loads(userbytes)
        print(user)
    

    与dumps和loads对应的两个方法更简单。

    1. dump
    import pickle
    with open('userinfo.pkl', 'wb') as f:
        pickle.dump(user, f)
    
    1. load
    import pickle
    with open('userinfo.pkl', 'rb') as f:
        user = pickle.load(f)
        print(user)
    

    二 shelve模块

    shevlve模块也用于序列化,它和pickle模块不同的地方在于,不需要关心文件模式,直接把数据当成字典来看待。而且shelve模块可以直接对数据进行修改,而不用覆盖之前的数据,但pickle要想修改的话只能使用wb模式覆盖

    shelve只有一个方法open,所以使用起来也很方便。同样的,shelve也支持python中所有的数据格式。

    import shelve
    user = {'name': 'musibii'}
    s = shelve.open('userdb.shv')
    s['user'] = user
    s.close()
    

    三 json模块

    1 json是什么

    JSON是Java script object notation的缩写,翻译过来就是js对象标识法。

    对于开发者而言,json是一种通用的数据格式,任何语言都能解析,所以每种语言都会有处理json格式数据的需求。

    1. json语法
    js 中的数据类型  python数据类型 的对应关系
    {}              字典
    []              list
    string ""       str
    int/float       int/float
    true/false      True/False
    null            None
    
    1. json格式的语法规范

    最外层通常是一个字典或列表

    {}or[],如果想定义json格式的数据,那么最外层直接写{},而且json中的字符串必须是双引号,json理论上可以嵌套任意多的层次。

    2 为什么用json

    虽然之前的pickle和shelve都很强大,而且使用也非常方便,那么为什么还出来json呢?这是因为pickle和shevle序列化之后的数据只有python才能解析出来,而通常在实际生产开发中,都是需要数据可以跨平台使用的。

    3 json的使用

    json模块的核心方法

    • dump
    • dumps
    • load
    • loads

    不带s的直接封装了write和read方法。

    1. dump
    import json
    jsontext = """{
    	"users": [{
    			"name": "musibii",
    			"age": 18
    		},
    		{
    			"name": "thales",
    			"age": 23
    		}
    	]
    }"""
    with open('a.json', 'wt', encoding='utf-8') as f:
        json.dump(jsontext, f)
    
    1. dumps
    import json
    jsontext = """{
    	"users": [{
    			"name": "musibii",
    			"age": 18
    		},
    		{
    			"name": "thales",
    			"age": 23
    		}
    	]
    }"""
    with open('a.json', 'wt', encoding='utf-8') as f:
        f.write(json.dumps(jsontext))
    
    1. load
    import json
    with open('a.json', 'rt', encoding='utf-8') as f:
        print(json.load(f))
    
    1. loads
    import json
    with open('a.json', 'rt', encoding='utf-8') as f:
        res = json.loads(f.read())
        print(res)
    
  • 相关阅读:
    部分测试文档
    部分说明文档
    最终复审
    M2postmortem
    Beta版本发布说明
    M2项目测试
    Daily scrum 12.24
    Daily scrum 12.21
    Daily scrum 12.20
    个人阅读作业2
  • 原文地址:https://www.cnblogs.com/zuanzuan/p/9813202.html
Copyright © 2011-2022 走看看