浅析Python 序列化与反序列化

作者:NorthFeng 时间:2023-05-01 14:36:16 

序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态(存在内存中)写入到临时或持久性存储区(硬盘)。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

实现对象的序列化和反序列化在python中有两种方式:json 和 pickle。

其中json用于字符串 和 python数据类型间进行转换,pickle用于python特有的类型 和 python的数据类型间进行转换,pickle是python特有的。

1、JSON序列化:json.dumps()


info = {
 "name":"tj",
 "age":22
}
import json
print(info)
print(type(info))
print(json.dumps(info))
print(type(json.dumps(info)))

f = open("test.txt","w")
# f.write(info)  # TypeError: write() argument must be str, not dict
f.write(json.dumps(info)) # 正常写入文件 f.write(json.dumps(info)) 等价于 json.dump(info, f)
f.close()

>>>
{'name': 'tj', 'age': 22}
<class 'dict'>
{"name": "tj", "age": 22}
<class 'str'>

2、JSON反序列化:json.loads()


f = open("test.txt","r")
# print(f.read()["age"]) #TypeError: string indices must be integers
data = json.loads(f.read()) # data = json.loads(f.read()) 等价于 data = json.load(f)
print(data["age"])
f.close()

>>>
22

注意:对于以下这种情况json就不能处理了


import json
def hello(name):
 print("hello,",name)
info = {
 "name":"tj",
 "age":22,
 "func":hello
}
f = open("test2.txt","w")
f.write(json.dumps(info)) #TypeError: Object of type function is not JSON serializable
f.close()

所以:json用于字符串 和 python数据类型间进行转换

3、pickle序列化:pickle.dumps()


import pickle
def hello(name):
 print("hello,",name)
info = {
 "name":"tj",
 "age":22,
 "func":hello
}

print(pickle.dumps(info)) #可见pickle序列化的结果输出为二进制,所以应使用wb的方式往文件中写
f = open("test2.txt","wb")
f.write(pickle.dumps(info)) # 等价于 pickle.dump(info,f)
f.close()

>>>
b'\x80\x04\x957\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x04alex\x94\x8c\x03age\x94K\x16\x8c\x04func\x94\x8c\x08__main__\x94\x8c\x05hello\x94\x93\x94u.'

对于函数hello,序列化的不是内存地址,而是整个数据对象,函数可以序列化。

4、pickle反序列化:pickle.loads()


f = open("test2.txt","rb")
data = pickle.loads(f.read()) # 等价于data = pickle.load(f)
print(data)
print(data["name"])
print(data["func"])

>>>
{'name': 'tj', 'age': 22, 'func': <function hello at 0x00000179EF69C040>}
tj
<function hello at 0x00000179EF69C040>

5、多次序列化与反序列化

1)json


import json
info = {
 "name":"tj",
 "age":22
}

f = open("test3.txt","w")
f.write(json.dumps(info))
info['age'] = 21
f.write(json.dumps(info))
f.close()
#
>>>
序列化两次后test3中的内容
test3.txt: {"name": "tj", "age": 22}{"name": "tj", "age": 21}

f = open("test3.txt","r")
# 报错,py3以上,多次dumps的文件反序列化报错,py2多次dumps的文件也能被反序列化,先序列化的先被反序列化
data = json.loads(f.read()) # json.decoder.JSONDecodeError
f.close()
print(data)

2)pickle


import pickle

info = {
 "name":"tj",
 "age":22
}

f = open("test2.txt","wb")
f.write(pickle.dumps(info)) # 等价于 pickle.dump(info,f)
info["sex"] = "女"
f.write(pickle.dumps(info)) # 等价于 pickle.dump(info,f)
f.close()

>>>
序列化两次后test2.txt中的内容
test2.txt: ��    }�(�name攲tj攲age擪u.��%    }�(�name攲tj攲age擪�sex攲濂硵u.

f = open("test2.txt","rb")
data = pickle.loads(f.read()) # 第一次反序列化正常
# data = pickle.loads(f.read()) # 第二次反序列化:EOFError: Ran out of input
print(data)
print(data["age"])
# print(data["sex"]) # KeyError: 'sex'

老王:是不是就不能多次序列化呢?那我修改后的数据还需要序列化写入到文件怎么办?

你:当然能多次序列化,把序列化后数据写到多个文件不就好了嘛。

来源:https://www.cnblogs.com/sunnytomorrow/p/13089970.html

标签:Python,序列化,反序列化
0
投稿

猜你喜欢

  • linux mysql 报错:MYSQL:The server quit without updating PID file

    2024-01-22 08:40:47
  • PHP扩展Swoole实现实时异步任务队列示例

    2023-11-10 05:11:22
  • Python通过类的组合模拟街道红绿灯

    2021-04-13 02:00:24
  • 使用Python脚本和ADB命令实现卸载App

    2023-04-11 03:59:39
  • python取数作为临时极大值(极小值)的方法

    2021-02-27 10:32:01
  • 超详细图解修改pip install默认安装路径的方法

    2023-02-18 05:00:09
  • 画好线框图的20个步骤

    2009-09-01 19:46:00
  • 用JS实现轮播图效果(二)

    2024-06-05 09:11:49
  • 一文搞懂Vue3中的异步组件defineAsyncComponentAPI的用法

    2024-04-29 13:09:08
  • PyQt5 多窗口连接实例

    2021-06-17 01:32:09
  • 设计的技术含量

    2009-01-12 18:20:00
  • SQL Server数据库对上亿表的操作

    2008-11-16 18:13:00
  • echarts学习之legend点击事件解读

    2024-05-03 11:10:17
  • python随机生成大小写字母数字混合密码(仅20行代码)

    2021-04-03 23:28:47
  • Oracle 数据显示 横表转纵表

    2024-01-22 23:35:05
  • Pytorch十九种损失函数的使用详解

    2021-07-19 22:23:07
  • 对Python中 \\r, \\n, \\r\\n的彻底理解

    2022-09-14 07:00:15
  • css设计小巧三条

    2008-01-21 13:04:00
  • JS数组遍历中for,for in,for of,map,forEach各自的使用方法与优缺点

    2024-05-02 16:15:45
  • 利用Python 制作二维码

    2022-07-28 01:07:13
  • asp之家 网络编程 m.aspxhome.com