1、什么叫序列化

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

2、用于序列化的两个模块,json和pickle

json,用于字符串 和 python数据类型间进行转换
pickle,用于python特有的类型 和 python的数据类型间进行转换
Json模块提供了四个功能:dumps、dump、loads、load pickle模块提供了四个功能:dumps、dump、loads、load

2.1json和pickle的对比分析

json vs pickle:

JSON:

优点:跨语言、体积小

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

Pickle:

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

缺点:只能在python中使用,存储数据占空间大 
# 把内存数据转成字符串数据类型,叫序列化  : dumps dump
# 把字符串数据类型转化成内存数据 叫反序列化 : loads load
dumps和dump,load和loads的区别: dumps是将对象序列化,loads将序列化字符串反序列化。
dump是将对象序列化并保存到文件中,load将序列化字符串从文件读取并反序列化。
重点:dumps仅转为为字符串,loads反序列化,转化为原型
# dumps仅转化成字符串
import json
data = {'k1':123,'k2':'hello'}
d = json.dumps(data)
d1 = json.loads(d)
print('序列化',d,type(d))
print('反序列化d1',d1,type(d1))
输出为:
序列化 {"k1": 123, "k2": "hello"} <class 'str'>
反序列化d1 {'k1': 123, 'k2': 'hello'} <class 'dict'>
重点:dump先主动转化再写入文件,load读取json文件返回原型
#转化为字符并写入文件dump
data2 ={'a1':123,'b1':456}
with open('test序列.py','a+',encoding='utf-8') as f:
f1 = json.dump(data2,f)
print('序列化dump:',f1,type(f1))
序列化dump: None <class 'NoneType'>
因为:json.dump主要用来json文件读写 #反序列化:
import json
with open('test序列.py','r') as f2:
file = json.load(f2)
print('反序列化load:',file,type(file))
反序列化load: {'a1': 123, 'b1': 456} <class 'dict'>
因为: json.load是读取json数据 json.dumps : ’dict’转成str json.dump是将python数据保存成json json.loads:str转成’dict’ json.load是读取json数据 json.load是解析json文件的;json.loads是解析json字符串的
dumps 和loads对应
dump 和 load 对应
# 只是把数据转成字符串存到内存里的意义?
# json.dumps json.loads
# 1 把你的内存数据通过网络,共享给远程其他人
# 2 定义了不同语言之间的交互规则
# (1)纯文本,坏处:不能共享复杂的数据类型。(2)xml,坏处:占空间大。(3)json,简单,可读性好

3、pickle模块

与JSON不同的是pickle不是用于多种语言间的数据传输,它仅作为python对象的持久化或者python程序间进行互相传输对象的方法,因此它支持了python所有的数据类型。

import pickle
data = {'k1':123,'k2':'abc'}
d = pickle.dumps(data)
d2 = pickle.loads(d)
print('序列化',d,type(d))
print('反序列化d1',d2,type(d2)) 输出:
序列化 b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01K{X\x02\x00\x00\x00k2q\x02X\x03\x00\x00\x00abcq\x03u.' <class 'bytes'>
pickle.dumps输出为二进制模式,bytes就是单纯的二进制 反序列化d1 {'k1': 123, 'k2': 'abc'} <class 'dict'> (2)
pickle.dump/pickle.load #pickle只能以二进制格式存储数据到文件 f = open('test1.txt','wb')
data = {'k1':123,'k2':'abc'}
f1 = pickle.dump(data,f) #序列化对象到文件
print('pickle.dump(data,f):',f1,type(f1))
f = open('test1.txt','rb')
red = pickle.load(f) #从文件中反序列化对象
print('pickle.load(f)',red,type(red)) 输出结果:
pickle.dump(data,f): None <class 'NoneType'>#保存的为对象
pickle.load(f) {'k1': 123, 'k2': 'abc'} <class 'dict'>

4、shelve

Shelve是对象持久化保存方法,将对象保存到文件里面,缺省(即默认)的数据存储文件是二进制的。

用途:可以作为一个简单的数据存储方案

shelve与pickle类似用来持久化数据的,不过shelve是以键值对的形式,将内存中的数据通过文件持久化,

值支持任何pickle支持的python数据格式,它会在目录下生成三个文件。

import shelve

s = shelve.open('test_shelf.db') #创建shelve并打开
try:
s['kk'] = {'int': 10, 'float': 9.5, 'String': 'Sample data'} #写入数据
s['MM'] = [1, 2, 3]
finally:
s.close() #关闭文件 import shelve
s = shelve.open('test_shelf.db') #打开文件
print(s['kk']) #访问数据
s.close() 输出:{'int': 10, 'float': 9.5, 'String': 'Sample data'} <class 'dict'> (2)对于存储的key,value值,只能添加key,value,可修改整个value,不能单独修改列表或字典中的元素 s = shelve.open('test_shelf.db') #打开文件 #添加数据:s['k2']=[1,2,3] 若s['k2'] = [1,2,3]
#添加后修改(NO) s['k2'][0]=99 #修改存储的value的单个值时不生效也不报错 #可以整个修改: s['k2']=(33,44) #可以修改key的value 写回(write-back)由于shelve在默认情况下是不会记录待持久化对象的任何修改的,所以我们在shelve.open()时候需要修改默认参数,否则对象的修改不会保存。 >>> s = shelve.open('test_s.db',writeback=True) #使用回写功能打开
>>> print(s['k1']) #初始值
{'float': 8.8, 'string': 'python', 'int': 10}
>>> print(s['k2'])
(33, 44)
>>> s['k1']['float']='99.99' #修改字典中的元素
>>> print(s['k1']) #成功修改
{'float': '99.99', 'string': 'python', 'int': 10}
# 1.创建一个shelf对象,直接使用open函数即可

import shelve
s = shelve.open('test_shelf.db') #
try:
s['kk'] = {'int': 10, 'float': 9.5, 'String': 'Sample data'}
s['MM'] = [1, 2, 3]
finally:
s.close() # 2.如果想要再次访问这个shelf,只需要再次shelve.open()就可以了,然后我们可以像使用字典一样来使用这个shelf import shelve
try:
s = shelve.open('test_shelf.db')
value = s['kk']
print(value)
finally:
s.close() # 3.对shelf对象,增、删、改操作 import shelve
s = shelve.open('test_shelf.db', flag='w', writeback=True)
try:
# 增加
s['QQQ'] = 2333
# 删除
del s['MM']
# 修改
s['kk'] = {'String': 'day day up'}
finally:
s.close() # 注意:flag设置为‘r’-只读模式,当程序试图去修改一个以只读方式打开的DB时,将会抛一个访问错误的异常。异常的具体类型取决于anydbm这个模块在创建DB时所选用的DB。异常举例:anydbm.error: need ‘c’ or ‘n’ flag to open new db # 4.循环遍历shelf对象 import shelve
s = shelve.open('test_shelf.db')
try:
# 方法一:
for item in s.items():
print ('键[{}] = 值[{}]'.format(item[0], s[item[0]]))
# 方法二:
for key, value in s.items():
print(key, value)
finally:
s.close()
writeback=True,对子字典修改完后要写回,否则不会看到修改后的结果
open(filename, flag='c', protocol=None, writeback=False):

12 python json&pickle&shelve模块的更多相关文章

  1. Python json & pickle & shelve模块

    json & pickle 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇 ...

  2. Python json & pickle, shelve 模块

    json 用于字符串和python的数据类型间的转换 四个功能 dumps dump loads load pickle 用于python特有的类型和python的数据类型进行转换 四个功能 dump ...

  3. python序列化: json & pickle & shelve 模块

    一.json & pickle & shelve 模块 json,用于字符串 和 python数据类型间进行转换pickle,用于python特有的类型 和 python的数据类型间进 ...

  4. python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib subprocess logging re正则

    python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib  subprocess ...

  5. day6_python序列化之 json & pickle & shelve 模块

    一.json & pickle & shelve 模块 json,用于字符串 和 python数据类型间进行转换pickle,用于python特有的类型 和 python的数据类型间进 ...

  6. Python全栈之路----常用模块----序列化(json&pickle&shelve)模块详解

    把内存数据转成字符,叫序列化:把字符转成内存数据类型,叫反序列化. Json模块 Json模块提供了四个功能:序列化:dumps.dump:反序列化:loads.load. import json d ...

  7. Python序列化,json&pickle&shelve模块

    1. 序列化说明 序列化可将非字符串的数据类型的数据进行存档,如字典.列表甚至是函数等等 反序列化,将通过序列化保存的文件内容反序列化即可得到数据原本的样子,可直接使用 2. Python中常用的序列 ...

  8. json,pickle,shelve模块,xml处理模块

    常用模块学习—序列化模块详解 什么叫序列化? 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes. 为什么要序列化? 你打游戏过程 ...

  9. json&pickle&shelve模块

    之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval就不管用了 ...

随机推荐

  1. jsp servlet 进行基于js的用户验证

    写这个只是完成使用js文件参数进行用户验证的处理的jsp 版,已经写过 asp.net php nodejs 以及纯js的,现在完善jsp的 使用的技术是比较简单的就是站点应用我们的js脚本,但是是带 ...

  2. spark数据倾斜

    数据倾斜的主要问题在于,某个分区数量很巨大,在做map运算的时候,将会发生别的分区task很快计算完成,但是某几个分区task的计算成为了系统的瓶颈,明显超过其他分区时间:   1.方案:Kafka的 ...

  3. OpenWrt的web服务器

    参考: http://www.szchehang.com/news/10602.html 我们登录的路由器主界面就是通过这个软件指定了80端口来访问的.我们要添加自己额外的网站服务,那只需要重新定义一 ...

  4. DBA的规范

    DBA操作规范 1.涉及业务上的修改/删除数据,在得到业务方.CTO的邮件批准后方可执行,执行前提前做好备份,必要时可逆.   2.所有上线需求必须走工单系统,口头通知视为无效.   3.在对大表做表 ...

  5. VS2010中visual assist x的一些问题

    1.如你想输入return关键字,那么在你输入r的时候该工具就会把带r的相关函数都列出,你选择一个即可,免去了连续输入和牢记的烦恼 2.当你对某个函数不是很理解的时候,你可以将鼠标放在该函数上,该工具 ...

  6. win xp 安装 VS2010 时要重启是因为没安装WINDOWS INSTALLER 4.5

    win xp 安装 VS2010 时要重启是因为没安装WINDOWS INSTALLER 4.5. 无意间看到VS2010安装列表中有一项是 WINDOWS INSTALLER 4.5 . 装这个玩意 ...

  7. 关于 android 读取当前手机号码

    手机号码不是所有的都能获取.只是有一部分可以拿到.这个是由于移动运营商没有把手机号码的数据写入到sim卡中.SIM卡只有唯一的编号,供网络与设备识别那就是IMSI号码,手机的信号也可以说是通过这个号码 ...

  8. centos6+nginx+php+mysql+memcached+wordpress

    centos6+nginx+php+mysql+memcached+wordpress 搭建步骤(1) LNMP 平台搭建: 请参考:http://www.cnblogs.com/ligao/p/61 ...

  9. Spring Cloud config之一:分布式配置中心入门介绍

    Spring Cloud Config为服务端和客户端提供了分布式系统的外部化配置支持.配置服务器为各应用的所有环境提供了一个中心化的外部配置.它实现了对服务端和客户端对Spring Environm ...

  10. python 可视化 二维坐标标注等等

     基本画图操作: import matplotlib.pyplot as plt import numpy as np x = np.linspace(-3,3,50) y1 = 2*x+1 y2 = ...