python-28-序列化模块

前言

序列化?TCP/IP协议只支持字节数组的传输,不能直接传我们平时用到的一组数据对象。对象序列化的结果一定是字节数组!

当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。所以在Python中就有丰富的序列化模块。

一、json 序列化模块

json是一种轻量级的数据交换格式,就好像中国地方语言有很多,你可能听不懂,但是只要我们都懂得中文国语那一定能一起沟通了。

  • 通用的序列化格式,平时也是常见的一种数据结构;
  • python中只有部分数据类型能够进行序列化转换成字符串;

1.dumps序列化 和 loads反序列化:

# 1.dumps序列化 和 loads反序列化
import json
dic = {'k': 'v'}
print(dic, '序列化前的类型:', type(dic))
ret_str = json.dumps(dic)
print(ret_str, '序列化后的类型:', type(ret_str))
ret_dic = json.loads(ret_str)
print(ret_dic, '反序列化后:', type(ret_dic))
# 序列化的类型有:str、int、list、dict、tuple

 2、dump 和 load 对一个对象进行序列化和反序列化

# 2、dump 和 load 对一个对象进行序列化和反序列化
import json
dic = {'k': '中国'}
with open('fff', 'w', encoding='utf-8')as f:
    json.dump(dic, f, ensure_ascii=False)
with open('fff', encoding='utf-8')as f:
    print(json.load(f))

 如果不设置 ensure_ascii=False ,我们的fff文件将以Unicode编码写入:{"k": "\u4e2d\u56fd"}

3、使用 dumps 换行写入文件 loads 一行一行读:

# 3、使用 dumps 换行写入文件:
import json
dic = [{'k1': 1}, {'k2': 2}, {'k3': 3}]
f = open('test', 'w')
for i in dic:
    str_dic = json.dumps(i)
    print(type(str_dic), str_dic)
    f.write(str_dic+'\n')
f.close()

# loads 一行一行读
lis = []
f = open('test')
for i in f:
    dic = json.loads(i)
    print(type(dic), dic)
    lis.append(dic)
print(lis)

二、pickle 序列化模块

1、和json拥有的方法相同。

  • Python中的所有数据类型都支持,与文件需要加b,如rb、wb
  • 支持分次dumps和loads

dumps和loads:

# 什么数据类型都可以,与文件需要加b,如rb、wb
# 支持分次dumps和loads
# dumps和loads:
import pickle
dic = [{'k1': 1}, {'k2': 2}, {'k3': 3}]
str_dic = pickle.dumps(dic)
print(str_dic)
dic1 = pickle.loads(str_dic)
print(dic1)

三、shelve 序列化模块

1、只提供一个open方法,序列化句柄
2、使用句柄操作,非常方便

import shelve
f = shelve.open('test')
f['k'] = {'k': '广深小龙'}
f.close()

f1 = shelve.open('test', writeback=True)     # writeback=True会记录所操作的增删改
dic = f1['k']
print(type(dic), dic)
f1.close()

 shelve就好像在Python中操作dict数据类型一样,shelve序列化会生成三个文件:

等等还有其他如:messagepack

欢迎来大家QQ交流群一起学习:482713805

发布了83 篇原创文章 · 获赞 0 · 访问量 775

猜你喜欢

转载自blog.csdn.net/qq_42675140/article/details/104872705
今日推荐