python中存在三种序列化的方案(数据存储)

在我们存储数据或者网络传输数据的时候. 需要对我们的对象进行处理. 把对象处理成方便存储和传输的数据格式. 这个过程叫序列化. 不同的序列化, 结果也不同. 但是目的是一样的. 都是为了存储和传输

1. pickle. 可以将我们python中的任意数据类型转化成bytes并写入到文件中.  同样也可以把文件中写好的bytes转换回我们python的数据. 这个过程被称为反序列化
2. shelve. 简单另类的⼀一种序列化的方案. 有点儿类似后面我们学到的redis. 可以作为一种小型的数据库来使用
3. json. 将python中常见的字典, 列表转化成字符. 是目前前后端数据交互使用频率最高的一种数据格式.
import pickle
可以将对象写入到文件中
#基本用法
# pickle.dump(obj, file, protocol=None, *, fix_imports=True)  可以写入到文本中()
# pickle.dumps(obj, protocol=None, *, fix_imports=True)  一般用于正常的操作
# pickle.load(file, *, fix_imports=True, encoding="ASCII", errors="strict") 可以从文本加载
# pickle.loads(s, *, fix_imports=True, encoding="ASCII", errors="strict")  一般用于正常的操作classCat:
def__init__(self,name):
self.name = name
defEatting(self):
print('I want to eat a mouse')
# pickle.dump(obj, file, protocol=None, *, fix_imports=True)可以写入到文本中()
# pickle.dumps(obj, protocol=None, *, fix_imports=True)  一般用于正常的操作
# pickle.load(file, *, fix_imports=True, encoding="ASCII", errors="strict") 可以从文本加载
# pickle.loads(s, *, fix_imports=True, encoding="ASCII", errors="strict")  一般用于正常的操作BlueCat = Cat('BlueCat')
BlueCat1 = Cat('BlueCat1')
BlueCat2= Cat('BlueCat2')
BlueCat3 = Cat('BlueCat3')
# S1 = pickle.dumps(BlueCat)#序列化一个对象,将对象转化成bytes的形式
# print(type(S1))#
# S2 = pickle.loads(S1)  #进行反序列化,将bytes 转化为对象
# print(type(S2))#
# S2.Eatting()#I want to eat a mouse
#gg = [BlueCat1,BlueCat2,BlueCat3]
pickle.dump(gg,open('da','wb')) #写入将对象以列表的形式通过pickle 转化为bytes的形式写入到文件,原因是防止取对象的时候,当对象被拿完了,再拿就会报错hh = pickle.load(open('da','rb'))#从文本中读取,将bytes的形式转化为列表fori inhh:
print(type(i)) #》》 第一次print(i.name) #BlueCat1》》 第一次
简版的登录程序:
classUser:
def__init__(self,name,password):
self.name  = name
self.password = password
classclient:
defregist(self):
print('开始注册用户:')
uname = input('请输入你的用户名:')
upwd = input('请输入你的密码:')
UTemp = User(uname,upwd)
withopen('userinfo','ab') asf:
pickle.dump(UTemp,f)
print('注册成功')
deflogin(self):
print('******登录******')
uname = input('请输入你的用户名:')
upwd = input('请输入你的密码:')
withopen('userinfo','rb') asf :
while1:
try:
dd = pickle.load(f)
ifdd.name == uname anddd.password == upwd:
print('登录成功!!!')
break
exceptException ase:
print('登录失败!!!')
break#a = client()
a.regist()
a.regist()
a.regist()
a.regist()
a.login()
import shelve
shelve提供python的持久化操作. 什么叫持久化操作呢? 说白话,就是把数据写到硬盘上.在操作shelve的时候非常的像操作一个字典,相当于文件类型的字典
importshelve#shelve.open(filename, flag='c', protocol=None, writeback=False)
gg = shelve.open('haha',writeback=True)
gg['name'] = 'cisco'gg['hobby'] = [1,2,3,4,5,6,7,8,9,0]for a,b ingg.items():print(a,b)
gg['hobby'][0] = 99
for a,b ingg.items():print(a,b)
import json
json全称javascript object notation,是我们前后端交互的枢纽
importjson#json.dumps()#把字典转换成json字符串#json.loads()#把json字符串转化成字典#json.dump()#把字典转换成json字符串.写入到文件#json.load()#把文件中的json字符串读取.转化成字典
dic = {'输出':'鲁班','坦克':'项羽','法师':'安琪拉了'}
gg= json.dumps(dic,ensure_ascii=False) #ensure_ascii=False,是能够看到中文
print(gg)#{"输出": "鲁班", "坦克": "项羽", "法师": "安琪拉了"}
print(type(gg))#
bb= '{"输出": "鲁班", "坦克": "项羽", "法师": "安琪拉"}'gg=json.loads(bb)print(gg)#{'输出': '鲁班', '坦克': '项羽', '法师': '安琪拉'}
print(type(gg))#
gg = json.dump(dic,open('json.data','w',encoding='utf-8'),indent=4,ensure_ascii=False)print(gg)#None # ensure_ascii=False 保存到文件的时候不使用ascii 编码
print(type(gg))#
dd= json.load(open('json.data','r',encoding='utf-8'))print(type(dd))#
print(dd)#{'输出': '鲁班', '坦克': '项羽', '法师': '安琪拉了'}
#将一个类的属性保存到json中
classPerson:def __init__(self,name,func):
self.name=name
self.func=func#ensure_ascii=True 保存到文件的时候不使用ascii 编码
a = Person('鲁班','射手')#方案1,通过类的特殊方法
dd = json.dumps(a.__dict__,ensure_ascii=False)print(dd)#方案2,通过自己建立转换模板
defgg(obj):print('哈哈')return {'kk':obj.name,'fn':obj.func}#hh = json.dumps(a,default=gg,ensure_ascii=False) #{"kk": "鲁班", "fn": "射手"}
print(hh)
#将jsonz字符串转换为对象
defgg(dic):return Person(dic['kk'],dic['fn'])
a= '{"kk": "鲁班", "fn": "射手"}'
print(json.loads(a,object_hook=gg))
hh= json.loads(a,object_hook=gg)print(hh.name)
default = 把对象转化成字典. 需要自己写转换过程
object_hook = 把字典转化成对象. 需要自己写转换过程
configparser模块

该模块适用于配置⽂文件的格式与windows ini文件类似,可以包含一个或多个节(section)每个节可以有多个参数(键=值)


importconfigparser
gg = configparser.ConfigParser()#对文件进行初始化gg['DEFAULT'] = {'NAME':'panzhenwei.com'}#gg['Server1'] = {'IPADDR':'192.168.10.25','
MASK':'255.255.255.0',
'DAFAULTGATE':'192.168.10.1'}
gg['Server2'] = {'IPADDR':'192.168.10.26','
MASK':'255.255.255.0',
'DAFAULTGATE':'192.168.10.1'}
gg['Server3'] = {'IPADDR':'192.168.10.27','
MASK':'255.255.255.0',
'DAFAULTGATE':'192.168.10.1'}
gg['Server4'] = {'IPADDR':'192.168.10.28','
MASK':'255.255.255.0',
'DAFAULTGATE':'192.168.10.1'}
withopen('bb.txt','w') asf :
gg.write(f)#写入文件
对文件进行读取和修改
gg = configparser.ConfigParser()#对文件进行初始化gg.read('bb.txt')#直接写读取的文件名fori ingg:
print(i)
print(type(i))

结果:


fori ingg['DEFAULT']:
print(i)#name

可以向字典一样进行增删改查,但是都是在内存上修改的,保存如下:
gg.write(open("bb.txt", mode="w"))