博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

模块--序列化

Posted on 2019-01-04 17:28  GraceNana  阅读(110)  评论(0编辑  收藏  举报

序列化 : 在储存数据或者网络传输数据的时候.需要对对象进行处理,把对象处理成方便储存和传输的数据格式.这个过程叫序列化.

三种序列化的方案:

1.pickle 将python的数据类型转化成bytes并写入到文件中. 或把文件中写好的bytes转回python的数据,这个过程成为反序列化

import pickle
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

p1 = Person('Max', 18)   #创建对象
#序列化
bs = pickle.dumps(p1)#b'\x80\x03c__main__\nPerson\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\
                x03X\x03\x00\x00\x00Maxq\x04X\x03\x00\x00\x00ageq\x05K\x12ub.'
#反序列化 pp1 = pickle.loads(bs) #<__main__.Person object at 0x0386A290>

写入文件操作

import pickle
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

p1 = Person('Max', 18)
f = open('info.pickle', mode = 'wb')
pickle.dump(p1, f)  
f.close()
f = open('info.pickle', mode = 'rb')
pp1 = pickle.load(f)  
print(pp1.name)     #Max       

上述为写入一个对象,如果是写入多个对象,每次执行pickle.load(f)即可调出下一个对象

 可以选择使用while 循环调出所有的对象:

while 1:
    try:
        p = pickle.load(f)
        print(p)
    except Exception:
        break

多个对象读写,建议使用list,方便全部取出,循环读取**

import pickle
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

p1 = Person('Max', 18)
p2 = Person('amy', 18)
p3 = Person('fred', 18)
lst = [p1,p2,p3]
f = open('info.pickle', mode = 'wb')
pickle.dump(lst, f)
f.close()
f = open('info.pickle', mode = 'rb')
ll = pickle.load(f)            #对象列表
for i in ll:
    print(i.name,end=' ')    #Max amy fred

2. shelve 简单另类的一宗序列化的方案

3. json 将python中常见的字典,列表转化成字符串.是目前前后端数据交互使用频率最高的一种数据格式

import json
dic = {'a': 'apple', 'b': 'banana', 'c': 'pear'}
s = json.dumps(dic, ensure_ascii = False) #如果没有ensure_ascii = False,则value以ascii码形式展示
print(s)     #{"a": "apple", "b": "banana", "c": "pear"}→字符串

s1 = '{"a": "apple", "b": "banana", "c": "pear"}'
dic = json.loads(s1)
print(type(dic),dic) #<class 'dict'> {'a': 'apple', 'b': 'banana', 'c': 'pear'}  →字典

 

json文件操作

import json
dic = {'a': 'apple', 'b': 'banana', 'c': 'pear'}
f = open('fruit.json', mode = 'w', encoding = 'utf-8')  #写入一个字典
json.dump(dic, f, ensure_ascii = False)
f.close()

f = open('fruit.json', mode = 'r', encoding = 'utf-8')
dic = json.load( f)
print(dic)      #{'a': 'apple', 'b': 'banana', 'c': 'pear'}
f.close()

对于多个字典,和pickle类似,可以写到列表中,再写入json