Python中的序列化模块
Python中的序列化模块包括:json、pickle、shelve。
json
常用操作:dumps、loads、dump、load方法。
dump
与load
有“持久化”功能!
dumps与loads
import json
# dumps方法——将字典(主要)对象转换成字符串
dic = {'a1':1,'b':2}
s1 = json.dumps(dic)
print(s1,type(s1)) #{"a1": 1, "b": 2} <class 'str'>
# loads方法——将字符串转换成字典
d1 = json.loads(s1)
print(d1,type(d1))#{'a1': 1, 'b': 2} <class 'dict'>
di = '{"a1":1}'
dl = '[1,2,3,4,5]'
dii = json.loads(di)
dll = json.loads(dl)
print(dii,type(dii))#{'a1': 1} <class 'dict'>
print(dll,type(dll))#[1, 2, 3, 4, 5] <class 'list'>
dump与load
注意,手动在文件里写的话,文件里的键值
如果是字符串的话必须用双引号!!!
dic1 = {'a1':1,'b':2}
# #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
json.dump(dic1,open('a1','w',encoding='utf8'))
#load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
d = json.load(open('a1','r',encoding='utf8'))
d['a1'] = 11
print(d)#{'a1': zz, 'b': 2}
json的几个博客笔记
字典的key为int时经过序列化、反序列化操作后会变成str
Python的datetime与Decimal数据进行json序列化的简单说明
对含有date/datetime以及Decimal格式数据的json数据进行转换
tornado的self.write输入字典数据与json的dumps方法的ensure_ascii参数的说明
pickle
基本操作
'''
# pickle——pickle只支持Python语言!!!
# 用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换
# pickle模块提供了四个功能:dumps、dump(序列化,存)、loads(反序列化,读)、load (不仅可以序列化字典,列表...
# 可以把python中任意的数据类型序列化)pickle是python特有的模块.
'''
# dumps、loads、dump、load
# dump、load支持持久化
import pickle
#将对象转换为类似二进制
print(pickle.dumps({'a1':1}))#b'\x80\x03}q\x00X\x01\x00\x00\x00aq\x01K\x01s.'
#将一堆类似于二进制的东西转换为字典
print(pickle.loads(b'\x80\x03}q\x00X\x01\x00\x00\x00aq\x01K\x01s.'))#{'a1': socketserver模块-循环接收0}
#注意是wb形式,不能指定编码!
pickle.dump({'b':2},open('p','wb'))
d = pickle.load(open('p','rb'))
print(d) #{'b': 2}
'''
###pickle与json的对比###
# loads—— json里是:将字符串转为字典;pickle里:将字节转换为字典
# dumps——json里是:将字典转换为字符串;pickle里是:将字典转换为字节
# load——json里是:将文件中的字符串转换为字典;pickle里是:将文件中的字节转换为字典
# dump——json里是:将字典转换为字符串写入到文件中;pickle里是:将字典转换为字节写入到文件中
'''
个人博客及相关练习
import pickle
def func1():
print(1)
def func2():
print(2)
if __name__ == '__main__':
f1 = func1
f2 = func2
with open('p1','ab')as f:
pickle.dump(f1,f)
pickle.dump(f2,f)
with open('p1','rb')as f:
func1 = pickle.load(f)
func2 = pickle.load(f)
fff = pickle.load(f)
fff2 = pickle.load(f)
print(func1)
print(func2)
print(fff)
print(fff2)
func1()
func2()
fff()
fff2()
# for em in f:
# print(em)
# func = pickle.load(em)
# func()
shelve
###文件+字典操作
import shelve
#没有encoding
f = shelve.open('sh',writeback=True) #创建一个文件
f['name'] = 'wanghw'
f['age'] = 18
print(f['name'])
print(f['age'])
f['name'] = ['wanghw','whw']
print(f['name'])
#查看这个字典!
for i in f:
print(i) #获取到所有的键,必须用for
print(f[i])# 获取所有的值
l = f.items()
print(list(l))#[('name', ['wanghw', 'whw']), ('age', 18)]
# shelve模块自动帮我们 dump与load了!
# 注意,“键”只能是字符串的形式!!!
# 注意,以后会出现一个问题:对字典的操作内容,有时候写不进去,
# 解决:在open的时候加一个参数:writeback=True
f = shelve.open('sh',writeback=True)