python序列化

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 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"))

 

posted @ 2018-11-15 21:48  好大一个圈  阅读(297)  评论(0编辑  收藏  举报