把内存数据转成字符,叫序列化;把字符转成内存数据类型,叫反序列化。

Json模块

Json模块提供了四个功能:序列化:dumps、dump;反序列化:loads、load。

import json

data = {
'roles':[
{'role':'monster','type':'pig','life':50},
{'role':'hero','type':'关羽','life':80}
]
}
#dumps和loads
d = json.dumps(data) #仅转成字符串
d2 = json.loads(d)
#dump
f = open('test.json','w')
json.dump(data,f) #转成字符串后直接写入文件,文件名后默认加上 .json 来说明这个文件是通过json转过的
#load
f = open('test.json','r')
data = json.load(f)

只是把数据类型转成字符串存在内存里的意义?   json.dumps      json.loads

1.把你的内存数据 通过网络 共享给远程其他人,只能用bytes格式

2.定义了不同语言之间的交互规则

1.纯文本,坏处:不能共享复杂的数据类型

2.xml 坏处:占空间大

3.json 好处:简单,可读性好

注:dump 可以 dump 多次,但是在 dump 多次之后,不能 load,因为数据类型不同的时候,没有办法识别是什么数据类型,无法处理。

pickle模块

import pickle

d = {'name':'alex','age':22}
l = [1,2,3,4,'rain']
#dumps
pickle.dumps(d) #d为bytes类型
#loads
d = pickle.dumps(d)
pickle.loads(d)
#dump
pk = open('data.pkl','wb')
pickle.dump(d,pk) #打开文件的时候,因为文件是bytes,必须以 'wb' 的格式打开
#load
f = open('data.pkl','rb')
d = pickle.load(f)

json VS pickle

Json:

优点:跨语言、体积小

缺点:只能支持int,str,list,tuple,dict

Pickle:

优点:专为python设计,支持python所有的数据类型

缺点:只能在python中使用(不能跨平台),存储数据占空间大

shelve 模块

shelve模块是一个简单的(k,v)将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式。

pycharm里写入:

import shelve

f = shelve.open('shelve_test')  #打开一个文件,不需要写打开模式

names = ["alex",  "rain",  "test"]
info = {'name': 'alex', 'age': 22} f["names"] = names #持久化列表,并不要求前后名字一致
f['info_dic'] = info f.close()

cmd里打开、获取

>>> import shelve
>>> f = shelve.open('shelve_test') #打开文件
>>> f.keys()
KeysView(<shelve.DbfilenameShelf object at 0x0000022D92FF7128>)
>>> list(f.keys())
['names', 'info_dic']
>>> list(f.items())
[('names', ['alex', 'rain', 'test']), ('info_dic', {'name': 'alex', 'age': 22})]
>>> f.get('names') #不会冲突,可以随意获取
['alex', 'rain', 'test']
>>> f.get('info_dic')
{'name': 'alex', 'age': 22}
>>> f['names']
['alex', 'rain', 'test']
>>> del f ['names'] #可以进行删除操作
>>> f.close() #删除后先关掉,再重新打开
>>> f = shelve.open('shelve_test')
>>> f.get('names')
>>> f['scores'] = [1,3,4,5,6] #可以添加
>>> f['scores']
[1, 3, 4, 5, 6]
>>> f['scores'] = [1,3,'A',5,6] #可以整个赋值,不能对其中的元素进行修改
>>> f['scores']
[1, 3, 'A', 5, 6]

Python全栈之路----常用模块----序列化(json&pickle&shelve)模块详解的更多相关文章

  1. Python全栈之路----常用模块----hashlib加密模块

    加密算法介绍 HASH       Python全栈之路----hash函数 Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列 ...

  2. Python全栈之路----常用模块----re 模块

    正则表达式就是字符串的匹配规则,在多数编程语言里都有相应的支持,python里对应的模块是 re. re的匹配语法有以下几种 re.match 从头开始匹配 re.search 匹配包含 re.fin ...

  3. Python全栈之路----常用模块----shutil模块

    高级的 文件.文件包.压缩包 处理模块   参考Python之路[第四篇]:模块     #src是原文件名,fdst是新文件名 shutil.copyfileobj(fsrc, fdst[, len ...

  4. Python全栈之路----常用模块学习----模块的种类和导入方法

    什么是模块? 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码 ...

  5. Python全栈之路----常用模块----软件开发目录规范

    目录基本内容 log  #日志目录 conf  #配置目录 core/luffycity  #程序核心代码目录  #luffycity 是项目名,建议用小写 libs/modules  #内置模块 d ...

  6. Python全栈之路----常用模块----logging模块

    很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,loggin ...

  7. Python全栈之路----常用模块----subprocess模块

    我们经常需要通过Python去执行一条系统命令或脚本,系统的shell命令是独立于你的python进程之外的,每执行一条命令,就是发起一个新进程,通过python调用系统命令或脚本的模块在python ...

  8. Python全栈之路----常用模块----datetime模块详解

    相比于time模块,datetime模块的接口则更直观,更容易调用. datetime模块定义了下面这几个类: datetime.date:表示日期的类,常用的属性有year,month,day: d ...

  9. Python全栈之路----常用模块----xml处理模块

    xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的 ...

随机推荐

  1. 多个yml文件的读取方式

    1配置pom.xml文件,以下配置将默认激活-dev.yml配置文件<profiles>        <profile>            <id>dev&l ...

  2. CPU、GPU、CUDA、cuDNN

    CPU擅长逻辑处理控制,GPU适合高强度的并行计算任务,为什么会存在这种差别?今天搜集了些相关资料,摘抄总结如下. 一.什么是GPU GPU这个概念是由Nvidia公司于1999年提出的.GPU是显卡 ...

  3. 如何练习打字之用英文写文章 & 如何调养右手之用左手握鼠标

    part1:how to practise your typing via writing a English blog it's easy to write english for chinese. ...

  4. php 面向对象二

    多态: 多态就是多种形态:多态分为方法重写和方法重载,但是php不支持方法重载 重写: 子类和父类的方法名必须一致,严格标准要求参数必须一致,但是参数可以不一致 子类中覆盖的方法不能比父类的方法访问权 ...

  5. BUG调试: Jump to the invalid address stated on the next line at 0x0: ???

    gdb或者vlagrind报告: ==14569== Jump to the invalid address stated on the next line ==14569== at 0x0: ??? ...

  6. 20145338 《网络对抗》逆向及Bof基础实验

    逆向及Bof基础实验 实践目标 ·本次实践的对象是一个名为pwn1的linux可执行文件. ·该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. ·该程序同时包含 ...

  7. redis应用--HyperLogLog

    如果你负责开发维护一个大型的网站,有一天老板找产品经理要网站每个网页每天的 UV 数据,然后让你来开发这个统计模块,你会如何实现? 如果统计 PV 那非常好办,给每个网页一个独立的 Redis 计数器 ...

  8. 5 第一个Django第4部分(表单和通用视图)

    上一节完成了视图编写,这一节为应用添加投票功能,也就是表单提交. 5.1编写一个简单的表单 5.2使用通用视图 5.3改良视图 5.1编写一个简单的表单 在网页设计中添加Form元素 polls/te ...

  9. c#分布式ID生成器

    c#分布式ID生成器   简介 这个是根据twitter的snowflake来写的.这里有中文的介绍. 如上图所示,一个64位ID,除了最左边的符号位不用(固定为0,以保证生成的ID都是正数),还剩余 ...

  10. Linux:Linux Mint系统的安装

    今天就更新一篇了,其实Linux系统大部分都是用虚拟机来安装的,毕竟Windows系统才是我们常用的系统,而Linux系统只是我们工作时才用的,而且使用虚拟机是非常方便的,不用重启电脑就可以使用另一种 ...