python模块之pickle、shelve、json
一 什么是序列化
序列化指的是将内存中的数据结构转化为一种中间格式,并存储到硬盘上。
(反序列化:将硬盘上存储的中间格式数据再还原为内存中的数据结构)
二 为什么要序列化
- 持久保持状态
需知一个软件/程序的运行就是处理一系列状态的变化,在编程语言中,‘状态‘会以各种有结构的数据类型(也可以称之为变量)的形式保存在内存中。
内存是无法永久保存数据的,当程序运行了一段时间,我们断电或者重启程序,内存中关于这个程序之前一段时间的数据都会被清空。
在断电或重启程序之前将程序当前运行的数据保存下来,便于下次程序执行能够从文件中载入之前的数据,然后继续执行,这就是序列化。
- 数据跨平台交互
序列化数据之后,不仅可以把序列化后的内容写入硬盘,还可以通过网络传输到别的机器上,如果收发的双方约定都使用一种序列化的格式,那么便打破了平台和语言带来的限制,实现了跨平台交互。
反过来,把变量内从从序列化的对象重新读到内存里称之为反序列化,即unpicking。
三 序列化数据的三个模块
一 pickle模块
pickle模块时python内置的用来序列化python数据格式的模块,支持序列化python中所有的数据类型,主要方法有四个;
- 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)
- loads
import pickle
with open('userinfo.pkl', 'rb') as f:
userbytes = f.read()
user = pickle.loads(userbytes)
print(user)
与dumps和loads对应的两个方法更简单。
- dump
import pickle
with open('userinfo.pkl', 'wb') as f:
pickle.dump(user, f)
- 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格式数据的需求。
- json语法
js 中的数据类型 python数据类型 的对应关系
{} 字典
[] list
string "" str
int/float int/float
true/false True/False
null None
- json格式的语法规范
最外层通常是一个字典或列表
{}or[],如果想定义json格式的数据,那么最外层直接写{},而且json中的字符串必须是双引号,json理论上可以嵌套任意多的层次。
2 为什么用json
虽然之前的pickle和shelve都很强大,而且使用也非常方便,那么为什么还出来json呢?这是因为pickle和shevle序列化之后的数据只有python才能解析出来,而通常在实际生产开发中,都是需要数据可以跨平台使用的。
3 json的使用
json模块的核心方法
- dump
- dumps
- load
- loads
不带s的直接封装了write和read方法。
- 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)
- 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))
- load
import json
with open('a.json', 'rt', encoding='utf-8') as f:
print(json.load(f))
- loads
import json
with open('a.json', 'rt', encoding='utf-8') as f:
res = json.loads(f.read())
print(res)
python模块之pickle、shelve、json的更多相关文章
- python 基础之pickle 与json 报错问题解决方案
Python 基础之pickle与json 有没有在搞pickle与json在进行数据储存的时候老是报错,这个有些让人烦恼,在之前有一篇介绍过它们的基本用法以及在使用过长中避免一些坑,但是今天在把对象 ...
- Python 常用模块(2) 序列化(pickle,shelve,json,configpaser)
主要内容: 一. 序列化概述 二. pickle模块 三. shelve模块 四. json模块(重点!) 五. configpaser模块 一. 序列化概述1. 序列化: 将字典,列表等内容转换成一 ...
- 各类模块的粗略总结(time,re,os,sys,序列化,pickle,shelve.#!json )
***collections 扩展数据类型*** ***re 正则相关操作 正则 匹配字符串*** ***time 时间相关 三种格式:时间戳,格式化时间(字符串),时间元组(结构化时间).***`` ...
- python 序列化 pickle shelve json configparser
1. 什么是序列化 我们把变量从内存中变成可存储或传输的过程称之为序列化. 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上. 反过来,把变量内容从序列化的对象重新读到内存里称 ...
- Day 21 序列化模块_Json,Pickle,Shelve
序列化 , 数据类型,列表 元组, 字符串 只有字符串能被写入文件中. 能在网络上传输的只能是bytes - 字符串 把要传输的和要存储的内容转换成字符串. 字符串 转换回 要传输和存储的内容 序列化 ...
- 序列化模块之 pickle 和 json
用于序列化的两个模块: json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 Json模块提供了四个功能:dumps ...
- Python模块之pickle(列表,字典等复杂数据类型与二进制文件的转化)
1.pickle模块简介 The pickle module implements binary protocols for serializing and de-serializing a Pyth ...
- python序列化_json,pickle,shelve模块
序列化 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes 把内存数据 转成字符,叫序列化 把字符 转成内存数据,叫反序列化 模块 ...
- 序列化模块组 pickle,json , xml , shelve , configparser
序列化是什么? 序列化指的是将内存中的数据结构转化为一种中间格式 并存储到硬盘上. 反序列化是什么? 将硬盘上存储的中间格式数据再还原为内存中的数据结构. 为什么要有序列化? 是为了将数据持久存储 较 ...
随机推荐
- ios系统的Date的兼容问题
内容来源网上,自己记录下 问题1: var date =new Date(); 这个是获取当前系统时间的对象,在各端都可以 但是: var date =new Date("2017-01-2 ...
- Mac 下 python 环境问题
一.Mac下,可能存在的 python 环境: 1.Mac系统自带的python环境在(由于不同的 mac 系统,默认自带的 python 版本可能不一样): Python 2.7.10: /Syst ...
- 功能强大的js数组方法:reduce
arr.reduce()方法接受一个函数作为累加器,数组中的每个值从左到右开始缩减,最终为一个值. reduce接受的参数主要有callback(回调函数)和可选参数initvalue(作为第一次调用 ...
- sqlserver 多行转一行
sql 例子: SELECT STUFF((SELECT ',' + CONVERT(VARCHAR, b.SCsinfoSourceId) FROM PZDataCsinfo b WHERE b.D ...
- Spark Programming--- Shuffle operations
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- ASP.NET MVC项目中App_Code目录在程序应用
学习ASP.NET MVC,如果你是开发ASP.NET MVC项目的,也许你去为项目添加前ASP.NET项目的APP_Code目录,在这里创建与添加的Class类,也许你无法在MVC项目所引用. 那这 ...
- Java面试题精选,大型网站系统架构你不得不懂的10个问题
作者:JavaGuide(公众号) 下面这些问题都是一线大厂的真实面试问题,不论是对你面试还是说拓宽知识面都很有帮助.之前发过一篇8 张图读懂大型网站技术架构 可以作为不太了解大型网站系统技术架构朋友 ...
- QQ的成功,远没有你想象的那么顺利和轻松
本文来自公众号“傅老师”(ID:fustory)的原创分享,感谢作者. 1.引言 如果QQ是一个人,看似风光,其实从出生到成长,过程饱经错荡,堪算坎坷.它的人生历程确实也够励志的了. 学习交流: ...
- 字符编码那点事:快速理解ASCII、Unicode、GBK和UTF-8
原作者:阮一峰(ruanyifeng.com),现重新整理发布,感谢原作者的无私分享. 1.引言 今天中午,我突然想搞清楚 Unicode 和 UTF-8 之间的关系,就开始查资料. 这个问题比我想象 ...
- 14.不同条目的listview
分类界面 整个项目的逻辑就是这样的 CategoryInfo public class CategoryInfo { private String title; private String url ...