Python中关于序列化的讨论,以及dump、dumps和load、loads区别的对比

序列化
序列化:pickle模块 json模块 shelve模块
一.pickle模块
1.pickle模块
1)可以将对象转换为一种可以传输或存储的格式。
2)pickle模块将任意一个python对象换成一个系统字节的操作过程叫做串行化对象。
3)pickle模块实现了python的所有数据序列化和反序列化。它不是用于多种语言间的传输,它仅作为python对象的持久化或者python程序间进行互相传输对象的。

import pickle
#序列化----将数据存储只文件中
info = {"Name:":"XiaoMing","Age:":22}
data_info = open("a.pkl","wb")
pickle.dump(info,data_info)
data_info.close()
#反序化---将文件读取出来并反序列化
data_out =open('a.pkl','rb')
a=pickle.load(data_out)
print(a)

2.dump和dumps的区别:
dump是将对象序列化并保存到文件中
dumps是将对象序列化

3.load和loads的区别:
load将序列化字符串从文件读取并反序列化
loads将序列化字符串反序列化
执行代码:data1 = [1,2,'a',3,'b']pi = pickle.dumps(data1)#dumps用来只是序列化对象

print(pi)
print(pickle.loads(pi))#loads也单单用来反序列化对象

data2 = {'Name':'Alex','Age':22,'Sex':'Boy'}
f = open('b.pkl','wb')
pickle.dump(data2,f)#dump不单把对象序列化,且可以把序列化的对象写入文件
f =open('b.pkl','rb')
print(pickle.load(f))#load可以把对象从文件中读取出来,然后再反序列化

执行的结果:

b'\x80\x03]q\x00(K\x01K\x02X\x01\x00\x00\x00aq\x01K\x03X\x01\x00\x00\x00bq\x02e.'
[1, 2, 'a', 3, 'b']

下面使用with方法
data3 = {'k1':123,'k2':456}
with open('c.pkl','wb') as str_p:
pickle.dump(data3,str_p)

with open('c.pkl','rb') as str_r:
a = pickle.load(str_r)
print(a)
#总结:dumps和dump,loads和load的区别
# dumps 只是将对象序列化
# dump 可以将对象序列化,并把序列化的对象保存到文件中
# loads 也只是将序列化的字符串反序列化
# load 可以将字符串从文件中读取出来,再反序列化


二.json
1.主要参数:
1)obj:将obj对象格式化并存储到文件对象中,文件必须为可写的文件句柄,json只产生str对象,
不支持bytes对象。
2)skipkey:如果为True,对象的基本类型必须是str,int,float,bool,Non
3)ensure_ascii = True:如果为true则所以传入的非ASCII字符都被转义,如果为False则字符将被原样输出。
4)check_circular=True:如果为true容器类型的循环引用检查将被跳过
5)indent=None:表述数组元素和对象将被按指定的值缩进,可以是整数或字符串’\t’
6)sort_keys=False:如果为True字典的输出将按键排序

2.json与pickle模块的区别:
1)json只能处理基本数据类型。
pickle能处理所有的Python的数据类型。
2)json用于各种语言之间的字符转换。
pickle用于python程序对象的持久化或者python程序对象的持久化或者python程序对象网络传输。

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

---------------------

import shelve

s = shelve.open('test_s.db')
s['k1'] = {'int':10,'float':8.8,'string':'python'}
s.close()

s = shelve.open('test_s.db')
print(s['k1'])
print(s['k1']['float'])
s.close()

执行结果

{'int': 10, 'float': 8.8, 'string': 'python'}
8.8

猜你喜欢

转载自www.cnblogs.com/mu1314/p/11108897.html
今日推荐