序列化及json&pickle的使用

一、序列化

  序列化是指把内存里的数据类型转变成字符串。以使其能存储到硬盘或通过网络传输到远程。——硬盘或网络传输时只能接受bytes。

Python中用于序列化的两个模块:

  • json:用于字符串和Python数据类型之间进行转换
  • pickle:用于Python特有类型和Python数据类型间进行转换。

  json和pickle模块都提供了四个功能:dumps、dump、loads、load

1、序列化

复制代码
# 把内存数据转成字符,叫做序列化
data = {
    'roles':[
        {'role':'monster','type':'pig'},
        {'role':'hero','type':'关羽'}
    ]
}

f = open("game_status","w")
# f.write(data)   # 写入失败,write只能接收字符串或者是bytes
f.write(str(data))  # 内容写入文件中
复制代码

2、反序列化

# 把字符转成内存数据类型,叫做反序列化
f = open("game_status","r")
d = f.read()
d = eval(d)
print(d['roles'])

二、json模块

把数据类型转成字符串存到内存里的意义:

  1、把你的内存数据通过网络共享给远程其他人

  2、定义了不同语言之间的交互规则

    纯文本:不能共享复杂的数据类型

    xml:占空间大

    json:相对来说,简单且可读性好。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import json
data = {
    'roles':[
        {'role':'monster','type':'pig'},
        {'role':'hero','type':'关羽'}
    ]
}
 
d = json.dumps(data)  # 仅转为字符串,可以存入硬盘
print(d,type(d))
"""
输出:{"roles": [{"role": "monster", "type": "pig"}, {"role": "hero", "type": "\u5173\u7fbd"}]} <class 'str'>
"""
 
f = open("test.json","w"# 创建文件对象
d1 = json.dump(data,f)  # dump不仅将数据变为字符串还直接写入文件,但是只能存入文件对象中
 
 
d2 = json.loads(d)  # 仅把字符串转为相应的数据类型
print(d2['roles'],type(d2))
"""
输出:[{'role': 'monster', 'type': 'pig'}, {'role': 'hero', 'type': '关羽'}] <class 'dict'>
"""
 
# 从文件中读入:
f = open("test.json","r")
data = json.load(f)
print(data['roles'])

三、pickle模块

复制代码
import pickle

d = {'name':'alex','age':22}
l = [1,2,3,4,'rain']
pk = open("data.pkl","wb")  # 针对bytes内容必须配置为wb模式
print(pickle.dumps(d))  # b'\x80\x03}q\x00(X\x04\x00\x....  bytes类型
pickle.dump(d,pk)
"""
data.pkl文件内容:�}q(XnameqXalexqXageqKu.
文件格式不可直接读。
"""

f = open("data.pkl","rb")
d = pickle.load(f)
print(d)
"""
输出:{'name': 'alex', 'age': 22}
"""

def sayhi():
    print('dddddd')

pickle.dumps(sayhi)
"""
执行不报错,说明pickle可以支持函数序列化
"""
复制代码

四、json&pickle对比

json:

  优点:跨语言、体积小

  缺点:只能支持int\str\list\tuple\dict

pickle:

  优点:专为Python设计,支持Python所有的数据类型。

  缺点:只能在Python中使用,存储数据占空间大。

 

posted @   休耕  阅读(342)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示