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") 一般用于正常的操作
class Cat:
def __init__(self,name):
self.name = name
def Eatting(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))#<class 'bytes'>
# S2 = pickle.loads(S1) #进行反序列化,将bytes 转化为对象
# print(type(S2))#<class '__main__.Cat'>
# 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的形式转化为列表
for i in hh:
print(type(i)) #<class '__main__.Cat'> 》》 第一次
print(i.name) #BlueCat1 》》 第一次
简版的登录程序:
class User:
def __init__(self,name,password):
self.name = name
self.password = password
class client:
def regist(self):
print('开始注册用户:')
uname = input('请输入你的用户名:')
upwd = input('请输入你的密码:')
UTemp = User(uname,upwd)
with open('userinfo','ab') as f:
pickle.dump(UTemp,f)
print('注册成功')
def login(self):
print('******登录******')
uname = input('请输入你的用户名:')
upwd = input('请输入你的密码:')
with open('userinfo','rb') as f :
while 1:
try:
dd = pickle.load(f)
if dd.name == uname and dd.password == upwd:
print('登录成功!!!')
break
except Exception as e:
print('登录失败!!!')
break
#
a = client()
a.regist()
a.regist()
a.regist()
a.regist()
a.login()
import shelve
shelve提供python的持久化操作. 什么叫持久化操作呢? 说白话,就是把数据写到硬盘上.在操作shelve的时候非常的像操作一个字典,相当于文件类型的字典
import shelve # 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 in gg.items(): print(a,b) gg['hobby'][0] = 99 for a,b in gg.items(): print(a,b)
import json
json全称javascript object notation,是我们前后端交互的枢纽
import json # 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))#<class 'str'> bb = '{"输出": "鲁班", "坦克": "项羽", "法师": "安琪拉"}' gg = json.loads(bb) print(gg)#{'输出': '鲁班', '坦克': '项羽', '法师': '安琪拉'} print(type(gg))#<class 'dict'> 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))#<class 'NoneType'> dd = json.load(open('json.data','r',encoding='utf-8')) print(type(dd))#<class 'dict'> print(dd)#{'输出': '鲁班', '坦克': '项羽', '法师': '安琪拉了'}
#将一个类的属性保存到json中 class Person: 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,通过自己建立转换模板 def gg(obj): print('哈哈') return {'kk':obj.name,'fn':obj.func}# hh = json.dumps(a,default=gg,ensure_ascii=False) #{"kk": "鲁班", "fn": "射手"} print(hh)
# 将jsonz字符串转换为对象 def gg(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)每个节可以有多个参数(键=值)
import configparser
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'}
with open('bb.txt','w') as f :
gg.write(f)#写入文件
对文件进行读取和修改
gg = configparser.ConfigParser()#对文件进行初始化
gg.read('bb.txt')#直接写读取的文件名
for i in gg:
print(i)
print(type(i))
结果:
for i in gg['DEFAULT']:
print(i)#name
可以向字典一样进行增删改查,但是都是在内存上修改的,保存如下:
gg.write(open("bb.txt", mode="w"))