1、pickle模块

python持久化的存储数据:

python程序运行中得到了一些字符串,列表,字典等数据,想要长久的保存下来,方便以后使用,而不是简单的放入内存中关机断电就丢失数据。python模块大全中pickle模块就排上用场了, 他可以将对象转换为一种可以传输或存储的格式。

pickle模块将任意一个python对象转换成一系统字节的这个操作过程叫做串行化对象。

python的pickle模块实现了python的所有数据序列和反序列化。基本上功能使用和JSON模块没有太大区别,方法也同样是dumps/dump和loads/load。cPickle是pickle模块的C语言编译版本相对速度更快。

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

import pickle

data2 = [1,2,3,4]
det_str = pickle.dumps(data2)
print(det_str) #output: 输出为二进制格式
b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04e.' #将数据序列化后存储到文件中
f = open('test.txt','wb') #pickle只能以二进制格式存储数据到文件
data = {'k1':'python','k2':'java'}
f.write(pickle.dumps(data)) #dumps序列化源数据后写入文件
f.close() #反序列化读取源数据
import pickle
f = open('test.txt','rb')
da = pickle.loads(f.read()) #使用loads反序列化
print(da)

dumps和dump,load和loads的区别:

dumps是将对象序列化

dump是将对象序列化并保存到文件中

loads将序列化字符串反序列化

load将序列化字符串从文件读取并反序列化

import pickle

data1 = [1,'a',2,'b',3,'c']
pi = pickle.dumps(data1) #序列化对象
print(pi)
print(pickle.loads(pi)) #反序列化对象 f = open('test1.txt','wb')
data2 = ['py','th','on',123]
pickle.dump(data2,f) #序列化对象到文件
f = open('test1.txt','rb')
red = pickle.load(f) #从文件中反序列化对象
print(red)

2、json模块

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

json.dump(obj,fp,*,skipkeys = False,ensure_ascii = True,check_circular = True,indent = None,separators = None,default = None,sort_keys = False,** kw)

将obj对象格式化并存储到文件对象中,文件必须为可写的文件句柄,json只产生str对象,不支持bytes对象,所以fp.write()必须支持str输入

skipkeys如果为True,对象的基本类型必须是str,int,float,bool,None

ensure_ascii=True,如果为true则所以传入的非ASCII字符都被转义,如果为false则字符将原样输出

check_circular=True,如果为true容器类型的循环引用检查将被跳过

indent=None,表示数组元素和对象将按指定的值缩进,可以是整数或字符串如'\t'

sort_keys=False,如果为True字典的输出将按键排序

import json

data=[{'k1':'v1','k2':'v2'},{'k3':'v3','k4':'k4'},{'k6':'v6','k5':'k5'}]

with open('test.txt','w') as pf:
json.dump(data,pf,indent=2,sort_keys=True)
pf.close() #output
[
{
"k1": "v1",
"k2": "v2"
},
{
"k3": "v3",
"k4": "k4"
},
{
"k5": "k5",
"k6": "v6"
}
]

json.dumps(obj,*,skipkeys = False,ensure_ascii = True,check_circular = True,indent = None,separators = None,default = None,sort_keys = False,** kw)

将obj对象格式化为str对象,参数含义和dump相同

import json
data=[{'k1':'v1','k2':'v2'},{'k3':'v3','k4':'k4'},{'k6':'v6','k5':'k5'}] pi = json.dumps(data,indent=2,sort_keys=True)
print(type(pi))
print(pi)
p2=json.loads(pi)
print(type(p2))
print(p2) #
<class 'str'>
[
{
"k1": "v1",
"k2": "v2"
},
{
"k3": "v3",
"k4": "k4"
},
{
"k5": "k5",
"k6": "v6"
}
]
<class 'list'>
[{'k1': 'v1', 'k2': 'v2'}, {'k3': 'v3', 'k4': 'k4'}, {'k5': 'k5', 'k6': 'v6'}]

json.load(fp,*,cls=None,object_hook=None,parse_float=None,parse_int=None,parse_constant=None,object_pairs_hook=None,**kw)

将文件对象反序列化为python对象,选项参数用来指定类型解码,在python3.6中fp可以使用二进制文件

import json

with open('test.txt','rb') as fp:
data1=json.load(fp)
print(type(data1))
print(data1) #
<class 'list'>
[{'k1': 'v1', 'k2': 'v2'}, {'k3': 'v3', 'k4': 'k4'}, {'k5': 'k5', 'k6': 'v6'}]

json.loads(s,*,encoding=None,cls=None,object_hook=None,parse_float=None,parse_int=None,parse_constant=None,object_pairs_hook=None,**kw)

将json文档的实例反序列化为python对象,参数含义同load()相同

import json
with open('test.txt','rb') as fp:
data1=json.loads(fp.read())
print(type(data1))
print(data1)

3、json与pickle模块的区别

1、JSON只能处理基本数据类型。pickle能处理所有Python的数据类型。

2、JSON用于各种语言之间的字符转换。pickle用于Python程序对象的持久化或者Python程序间对象网络传输,但不同版本的Python序列化可能还有差异。

4、shelve模块

shelve与pickle类似用来持久化数据的,不过shelve是以键值对的形式,将内存中的数据通过文件持久化,值支持任何pickle支持的python数据格式,它会在目录下生成三个文件。

>>> import shelve
>>> import tab
>>> s = shelve.open('test_s.db') #创建shelve并打开
>>> s['k1']={'int':10,'float':8.8,'string':'python'} #写入数据
>>> s.close() #关闭文件
>>> s = shelve.open('test_s.db') #打开文件
>>> print(s['k1']) #访问shelve中的数据
{'float': 8.8, 'string': 'python', 'int': 10}
>>> print(s['k1']['int'])
10
>>> s.close()

对于存储的key,value值,只能添加key,value,可修改整个value,不能单独修改列表或字典中的元素

>>> s = shelve.open('test_s.db',flag='r')
>>> print(s['k1'])
{'float': 8.8, 'string': 'python', 'int': 10}
>>> s['k2']=[1,2,3] #添加数据
>>> print(s['k2'])
[1, 2, 3]
>>> s['k2'][0]=99 #修改存储的value的单个值时不生效也不报错
>>> print(s['k2'])
[1, 2, 3]
>>> s.close() >>> s = shelve.open('test_s.db',flag='c')
>>> s.keys()
KeysView(<shelve.DbfilenameShelf object at 0x7fd4770f1850>)
>>> len(s)
2
>>> s['k2']=(33,44) #可以修改key的value
>>> print(s)
<shelve.DbfilenameShelf object at 0x7fd4770f1850>
>>> print(s['k2'])
(33, 44)

写回(write-back)由于shelve在默认情况下是不会记录待持久化对象的任何修改的,所以我们在shelve.open()时候需要修改默认参数,否则对象的修改不会保存。

上面这个例子中,由于一开始我们使用了缺省参数shelve.open()了,因此修改的值即使我们s.close()也不会被保存。

所以当我们试图让shelve去自动捕获对象的变化,我们应该在打开shelf的时候将writeback设置为True。当我们将writeback这个flag设置为True以后,shelf将会将所有从DB中读取的对象存放到一个内存缓存。当我们close()打开的shelf的时候,缓存中所有的对象会被重新写入DB。

>>> 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}

writeback方式有优点也有缺点。优点是减少了我们出错的概率,并且让对象的持久化对用户更加的透明了;但这种方式并不是所有的情况下都需要,首先,使用writeback以后,shelf在open()的时候会增加额外的内存消耗,并且当DB在close()的时候会将缓存中的每一个对象都写入到DB,这也会带来额外的等待时间。因为shelve没有办法知道缓存中哪些对象修改了,哪些对象没有修改,因此所有的对象都会被写入。

>>> print(s['k1'])
{'float': '99.99', 'string': 'python', 'int': 10}
>>> s['k1']['list']=[1,2,3]
>>> s['k1']['tuple']=(4,5,6)
>>> s['k1']['dic']={'a':123,'b':456}
>>> print(s['k1'])
{'dic': {'b': 456, 'a': 123}, 'int': 10, 'float': '99.99', 'string': 'python', 'tuple': (4, 5, 6), 'list': [1, 2, 3]}

python3之序列化(pickle&json&shelve)的更多相关文章

  1. 第二十二天- 序列化 pickle json shelve

    # 序列化:存储或传输数据时,把对象处理成方便存储和传输的数据格式,这个过程即为序列化# Python中序列化的三种方案:# 1.pickle python任意数据——>bytes写入⽂件:写好 ...

  2. 序列化 pickle & json & shelve

    把内存数据转成字符,叫序列化,dump,dumps 把字符转成内存数据类型,叫反序列化load,loads dumps:仅转成字符串 dump不仅能把对象转换成str,还能直接存到文件内 json.d ...

  3. python模块--pickle&json&shelve

    使用file文件处理时,写入的必须是str ,否则会报错. 例如:要把一个字典写入文件,写入时会报错 ,就算转换成str格式写入,读取的时候也不能按照dict格式读. >>> inf ...

  4. Python:序列化 pickle JSON

    序列化 在程序运行的过程中,所有的变量都储存在内存中,例如定义一个dict d=dict(name='Bob',age=20,score=88) 可以随时修改变量,比如把name修改为'Bill',但 ...

  5. python序列化之pickle,json,shelve

    模块 支持方法 说明 json dumps/dump loads/load 只能处理基本数据类型: 用于多种语言间的数据传输: pickle dumps/dump loads/load 支持pytho ...

  6. day21 pickle json shelve configpaser 模块

    1. 序列化:我们在网络传输的时候,需要我们对对象进行处理,把对象处理成方便存储和传输的格式,这个过程就叫序列化 序列化的方法不一定一样,三十目的都是为了方便储存和传输. 在python中有三种序列化 ...

  7. python之路 序列化 pickle,json

    运行代码,毫不留情地得到一个TypeError: Traceback (most recent call last): ... TypeError: <__main__.Student obje ...

  8. Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式

    Python第十四天 序列化  pickle模块  cPickle模块  JSON模块  API的两种格式 目录 Pycharm使用技巧(转载) Python第一天  安装  shell  文件 Py ...

  9. 序列化模块— json模块,pickle模块,shelve模块

    json模块 pickle模块 shelve模块 序列化——将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. # 序列化模块 # 数据类型转化成字符串的过程就是序列化 # 为了方便存储和网 ...

随机推荐

  1. 深入理解JSP

    JSP(Java server page)是Java EE规范最基本成员,他是Java Web开发的重点知识,尽管我们一直在用.但其原理知之甚少.今天重点研究一些JSP核心内容以及其工作原理. JSP ...

  2. ThoughtWorks 2017技术雷达

    前言: ThoughtWorks人酷爱技术.我们对技术进行构建.研究. 测试.开源.记述,并始终致力于对其进行改进-以求造福 大众.我们的使命是支持卓越软件并掀起IT革命.我们创建 并分享Though ...

  3. 自学Zabbix3.5.7-监控项item-Applications

    Applications应用程序用于对逻辑组中的项目进行分组.例如我们要监控MySQL,我们可以将所有和MySQL相关的item放到这个应用程序中.例如MySQL的availability of My ...

  4. Unix权限这点事

    Unix/Linux的权限管理还是比较复杂的,别人说看高级环境编程得看2,3遍.我想这应该是在Linux有了一定基础.但是我看的过程中确需要反复推敲,有些地方得翻来覆去看上5,6遍甚至更多,下面是自己 ...

  5. Lua中使用状态机FSM简单例子

    FSM 有限状态机: 一个有限状态机是一个设备,或者是一个设备模型,具有有限数量的状态,它可以在任何给定的时间根据输入进行操作,使得一个状态变换到另一个状态,或者是使一个输入或者一种行为的发生.一个有 ...

  6. python每天进步一点点

    1. apply, 可以调用函数和参数,如apply(Fun,(xxx,xxx)) 2. Format, 很好处理字符串的对齐命名,其他进制,打印等. 3. input(),接受输入 4. str() ...

  7. 【十九】require和include的区别

    1.require是一个函数,include是一个关键字 2.require是无返回值,include有返回值 3.include()会产生一个警告,而require()则导致一个致命的错误(出现错误 ...

  8. 云计算之路-阿里云上-2017年最错误的选择: 生产环境使用 docker swarm

    2017年12月29日 10:18 ~ 11:00 左右,由于整个 docker swarm 集群宕机,造成我们迁移至 .net core 跑在 docker swram 上的所有站点无法正常访问,由 ...

  9. 云储存第三方--阿里云OSS VS 又拍云USS

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p. ...

  10. 来腾讯云开发者实验室 学习.NET

    腾讯云开发者实验室为开发者提供了一个零门槛的在线实验平台,开发者实验室提供的能力: 零门槛扫码即可免费领取实验机器,支持使用自有机器参与,实验完成后支持保留实验成果: 在线 WEB IDE 支持 sh ...