Python中的序列化模块

Python中的序列化模块包括:json、pickle、shelve。

json

常用操作:dumps、loads、dump、load方法。

dumpload有“持久化”功能!

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的几个博客笔记

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里是:将字典转换为字节写入到文件中
'''

个人博客及相关练习

利用pickle处理python对象

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)