序列化和字典补充
序列化:
1.什么是序列化: 我们把变量从内存中变成可存储或传输的过程称之为序列化。
2.如何序列化:在python中提供了两个模块可进行序列化。分别是pickle和json。
3.pickle:pickle只能在python特有的内容,只能在python里面进行转换(缺点不能在不同语言间进行转换)
(1)pickle基础功能
pickle模块提供了四个功能:dumps、dump、loads、load。
dumps和dump都是进行序列化,而loads和load则是反序列化。
(2)dumps与dump区别与用法
dumps将所传入的变量的值序列化为一个bytes,然后,就可以将这个bytes写入磁盘或者进行传输。
而dump则更加一步到位,在dump中可以传入两个参数,一个为需要序列化的变量,另一个为需要写入的文件。
(3)loads用法
loads当我们要把对象从磁盘读到内存时,可以先把内容读到一个bytes,然后用loads方法反序列化出对象,
也可以直接用load方法直接反序列化一个文件。
4.json:无法对函数对像和类进行序列化(优点:可以在不同语言间进行转换;缺点:不可以对函数对象和类进行序列化)
(1)如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,
因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准
格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。
例1:pickle.dumps()#对函数进行序列化
import pickle
def foo():
print('ok')
data=pickle.dumps(foo)
f=open('pickle.text','wb')
f.write(data)
f.close()
例2:pickle.loads()解析
f=open('pickle.text','rb')
data=f.read()
data=pickle.loads(data)
data()#会报错,因为找不到地址了(地址发生变化了),所以读取不出来,运行报错
正确方式:
def foo():
print('ok')
f=open('pickle.text','rb')
data=f.read()
data=pickle.loads(data)
data()
(2)json中的方法和pickle中差不多,也是dumps,dump,loads,load。使用上也没有什么区别,区别在于,json中的序列化后格式为字符。
(3)序列化实例:json.dumps()(转换成字符串存储)
import json
dic={'name':'eric','age':'22'}
data=json.dumps(dic)
f=open('json.text','w')
f.write(data)
f.close()
(4)json.dump()#把json.dumps()简化一下
import json
dic={'name':'eric','age':'22'}
f=open('json.text','w')
# data=json.dumps(dic)
# f.write(data)
json.dump(dic,f)
f.close()
(5)json.loads()#解析字符串
f=open('json.text','r')
data=f.read()
data=json.loads(data)
print(data['name'])
(6)json.load()
f=open('json.text','r')
# data=f.read()
# data=json.loads(data)
data=json.load(f)
print(data['name'])
f.close()
shelve模块:shelve模块比pickle简单,只有一个open函数,返回类似字典对象,可读可写;key必须为字符串,而值可以是python所支持的
数据类型。(也只能在python中转换,无法不同语言进行转换)
(1)存shelve.open()
import shelve
f=shelve.open('shelve.text')
f['info']={'name':'eric','age':'22'}
f.close()
(2)取
import shelve
f=shelve.open('shelve.text')
# f['info']={'name':'eric','age':'22'}
data=f.get('info')
print(data)#{'name': 'eric', 'age': '22'}
f.close()
字典补充:
(1)get获取键直
d={'name':'eric','age':'22'}
print(d.get('name'))
(2).get('a','b')的内容a如果找不到值就返回值b
d={'name':'eric','age':'22'}
print(d.get('name'))
print(d.get('sex','man'))
序列化和字典补充
最新推荐文章于 2023-04-16 13:28:42 发布