一 什么是序列化

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

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

二 为什么要序列化

  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)

python模块之pickle、shelve、json的更多相关文章

  1. python 基础之pickle 与json 报错问题解决方案

    Python 基础之pickle与json 有没有在搞pickle与json在进行数据储存的时候老是报错,这个有些让人烦恼,在之前有一篇介绍过它们的基本用法以及在使用过长中避免一些坑,但是今天在把对象 ...

  2. Python 常用模块(2) 序列化(pickle,shelve,json,configpaser)

    主要内容: 一. 序列化概述 二. pickle模块 三. shelve模块 四. json模块(重点!) 五. configpaser模块 一. 序列化概述1. 序列化: 将字典,列表等内容转换成一 ...

  3. 各类模块的粗略总结(time,re,os,sys,序列化,pickle,shelve.#!json )

    ***collections 扩展数据类型*** ***re 正则相关操作 正则 匹配字符串*** ***time 时间相关 三种格式:时间戳,格式化时间(字符串),时间元组(结构化时间).***`` ...

  4. python 序列化 pickle shelve json configparser

    1. 什么是序列化 我们把变量从内存中变成可存储或传输的过程称之为序列化. 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上. 反过来,把变量内容从序列化的对象重新读到内存里称 ...

  5. Day 21 序列化模块_Json,Pickle,Shelve

    序列化 , 数据类型,列表 元组, 字符串 只有字符串能被写入文件中. 能在网络上传输的只能是bytes - 字符串 把要传输的和要存储的内容转换成字符串. 字符串 转换回 要传输和存储的内容 序列化 ...

  6. 序列化模块之 pickle 和 json

    用于序列化的两个模块: json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 Json模块提供了四个功能:dumps ...

  7. Python模块之pickle(列表,字典等复杂数据类型与二进制文件的转化)

    1.pickle模块简介 The pickle module implements binary protocols for serializing and de-serializing a Pyth ...

  8. python序列化_json,pickle,shelve模块

    序列化 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes 把内存数据 转成字符,叫序列化 把字符 转成内存数据,叫反序列化 模块 ...

  9. 序列化模块组 pickle,json , xml , shelve , configparser

    序列化是什么? 序列化指的是将内存中的数据结构转化为一种中间格式 并存储到硬盘上. 反序列化是什么? 将硬盘上存储的中间格式数据再还原为内存中的数据结构. 为什么要有序列化? 是为了将数据持久存储 较 ...

随机推荐

  1. Hadoop2.0源码包简介

    Hadoop2.0源码包简介 1.解压源码包: 2.目录结构: hadoop-common-project:Hadoop基础库所在目录,如RPC.Metrics.Counter等.包含了其它所有模块可 ...

  2. 深入Java集合学习系列:LinkedHashMap的实现原理

    参考下面链接: http://zhangshixi.iteye.com/blog/673789

  3. linux系统下安装redis以及java调用redis

    关系型数据库:MySQL  Oracle 非关系型数据库:Redis 去掉主外键等关系数据库的关系性特性 1)安装redis编译的c环境,yum install gcc-c++ 2)将redis-2. ...

  4. JAVA RSA加密AES加密

    RSA加密: import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.Cipher; imp ...

  5. mvc网站迁移.net core记录

    接口return Json()时序列号小写的问题 在Startup.cs->ConfigureServices方法配置一下解决 public void ConfigureServices(ISe ...

  6. Spark 介绍

    MapReduce给用户提供了简单的编程接口,用户只需要按照接口编写串行版本的代码,Hadoop框架会自动把程序运行到很多机器组成的集群上,并能处理某些机器在运行过程中出现故障的情况.然而,在MapR ...

  7. 18年最有"钱"途的专业就是它(文末有福利)

    根据社会调查机构麦可思发布的<2018年中国大学生就业报告>中得知,从就业率.薪资和就业满意度等多角度综合考量,信息安全专业为首推绿牌专业. 不管你是计算机相关专业的学生,还是已经工作的I ...

  8. JavaScript之DOM对象获取(1)

    我们在操作html中的节点的时候,第一步就需要获取到对应节点(元素),才能有后续的操作.获取节点的方式有很多 1.document.getElementById(‘id值’) 通过id精确的选中某一个 ...

  9. Javascript高级编程学习笔记(28)—— BOM(2)window对象2

    今天讲一下window对象和浏览器导航,弹窗等有关的内容 导航和打开窗口 window.open() 用于导航到某个特定 url 该方法接收四个参数 1.url 2.窗口目标(当页面中有多个框架fra ...

  10. Tomcat 的 ManagerApp 简单使用

    当启动Tomcat的时候,直接访问http://localhost:8080会直接进入下面页面,原因是Tomcat的默认项目是部署在webapps目录下的ROOT目录下的,这个manager项目就在R ...