Python 常用模块pickle
2024-01-09 12:45:51
Python 常用模块pickle
pickle序列化模块
【一】定义
- 序列化:将数据结构或对象转换为可存储或传输的格式
- 反序列化:将序列化后的数据恢复为开始的数据结构或者对象
【二】目的
- 数据持久化存储
- 远程通信
- 缓存
- 进程间通信
【三】序列化
- 将对象转换为字节流的过程称为序列化
pickle.dumps(obj, protocol=None, *, fix_imports=True, buffer_callback=None)
pickle.dump(obj, file, protocol=None, *, fix_imports=True, buffer_callback=None)
obj
:要序列化的对象file
:一个文件对象,通常以二进制写入模式打开文件protocol
:序列化的版本号,可以省略,默认(None
)最高版本fix_imports
:为True
默认,尝试自动修复在不同Python
版本之间可能的模块导入问题buffer_callback
:一个可选的回调函数,用于控制内部缓冲区的分配。默认使用内部缓冲区管理
import pickle
user_dict = {"name": "bruce", "age": "18"}
str_dict = pickle.dumps(user_dict)
print(str_dict)
print(type(str_dict))
# b'\x80\x04\x95\x1f\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x05bruce\x94\x8c\x03age\x94\x8c\x0218\x94u.'
# <class 'bytes'>
with open("a.pkl", "wb") as fp:
pickle.dump(user_dict, fp)
# pickle.dump(user_dict, open("a.pkl", "wb"))
【四】反序列化
- 将字节流还原成对象的过程称为反序列化
pickle.loads(data, *, fix_imports=True, encoding="ASCII", errors="strict"buffers=None)
pickle.load(file, *, fix_imports=True, encoding="ASCII", errors="strict",buffers=None)
data
:要序列化的字节流内容file
:一个文件对象,通常以二进制读取模式打开文件fix_imports
:为True
默认,尝试自动修复在不同Python版本之间可能的模块导入问题encoding
:字符串编码格式errors
:解码错误的处理方式,与str.decode()
方法中的参数相同。默认strict,即抛出UnicodeDecodeError
buffers
:一个可选的PickleBuffer
对象,用于提供自定义缓冲区的支持,默认None
import pickle
with open("a.pkl", "rb") as fp:
read_dict = pickle.load(fp)
# read_dict = pickle.load(open("a.pkl", "rb"))
print(read_dict)
print(type(read_dict))
# {'name': 'bruce', 'age': '18'}
# <class 'dict'>
【五】通用性
-
pickle
模块适用于大多数Python
对象,包括自定义类的实例、内置数据类型等。 -
不适用于某些特殊对象,比如文件句柄、数据库连接等。
-
josn
序列化以后java
、js
等语言可以识别 -
pickle
序列化以后,其他语言都不能识别
【六】应用
【1】函数写入文件、从文件读取函数
import pickle
def my_func():
print("这是定制函数")
pickle.dump(my_func, open("a.pkl", "wb"))
read_func = pickle.load(open("a.pkl", "rb"))
read_func() # 这是定制函数
【2】将实例写入文件、从文件读取实例
import pickle
class PeaShooter:
def __init__(self, name, attack_val):
self.name = name
self.attack_val = attack_val
pickle.dump(PeaShooter, open("a.pkl", "wb"))
read_object = pickle.load(open("a.pkl", "rb"))
ice_shooter = read_object("寒冰射手", 20)
pickle.dump(ice_shooter, open("a.pkl", "wb"))
read_instance = pickle.load(open("a.pkl", "rb"))
print(read_instance.__dict__)
# {'name': '寒冰射手', 'attack_val': 20}
文章来源:https://blog.csdn.net/weixin_48183870/article/details/135476231
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!