序列化:把对象转化成二进制字节
反序列化:把二进制字节转化回对象 Pickle模块的常见用法: Pickle.dunps   把对象(数据)转化成字节
Pickle.loads   把字节转化回对象(数据)
Pickle.dunp   把对象序列化成字节之后写入到文件
Pickle.load   把文件中的字节反序列化成对象

在Python中,序列化和反序列化是将数据结构转换为字节流或其他可存储或传输的格式,以及将字节流或其他格式还原为原始数据结构的过程。

序列化(Serialization)pickle.dumps方法

序列化通常涉及将数据结构转换为字节流或字符串的过程,以便将其保存到文件、数据库或通过网络传输。

pickle.dumps(obj, protocol=None, *, fix_imports=True, buffer_callback=None)

  • 作用:将一个对象序列化为一个字节对象。
  • 使用场景:通常用于在内存中处理对象,比如将对象传递给网络通信、存储到数据库,或在需要字节对象的地方使用。
  • 返回值:返回序列化后的字节对象

序列化(Serialization)pickle.dump方法

pickle.dump(obj, file, protocol=None, *, fix_imports=True, buffer_callback=None)

  • 作用:将一个对象序列化并写入文件。
  • 使用场景:通常用于将对象保存到文件,以便稍后再读取和使用。
  • 参数 file 是文件对象,用于写入序列化的数据。
  • 无返回值,数据被写入到文件中。

选择使用哪个函数取决于你的具体需求和场景。

pickle.dumps 主要用于在内存中进行对象序列化,返回字节对象。

pickle.dump 主要用于将序列化后的数据写入文件,存储到磁盘。

反序列化(Deserialization)pickle.loads方法

反序列化是将字节流或其他格式还原为原始数据结构的过程。

pickle.loads主要对应pickle.dumps 。用于在内存中进行序列化和反序列化,分别将对象转换为字节对象和将字节对象还原为对象。

pickle.loads(bytes_object, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None)

  • loadsload string 的缩写,用于将字符串(字节流)反序列化为对象。
  • 参数 bytes_object 是要反序列化的字节对象。
  • 返回值是反序列化后的对象。

反序列化(Deserialization)pickle.load方法

pickle.load 主要对应pickle.dump。用于与文件之间进行序列化和反序列化,分别将对象写入文件和从文件中读取序列化的数据并还原为对象。

pickle.load(file, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None)

  • loadload from file 的缩写,用于从文件中读取序列化的数据并反序列化为对象。
  • 参数 file 是文件对象。
  • 返回值是反序列化后的对象。

案例1:网络传输

pickle.dumps()将列表序列化为字节流,才可以进行网络传输(因为网络底层只认识字节)

import pickle

dic = {"name": "admin", "password": 123}
bs = pickle.dumps(dic)
print(bs) #运行结果
b'\x80\x04\x95!\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x05admin\x94\x8c\x08password\x94K{u.'

pickle.loads()将网络传输过来的字节,重新还原回原始的数据结构。

bs= b'\x80\x04\x95!\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x05admin\x94\x8c\x08password\x94K{u.'
dic = pickle.loads(bs)
print(dic, type(dic)) #运行结果
{'name': 'admin', 'password': 123} <class 'dict'>

案例2:文件存储

pickle.dumps() 用于将字典 data 序列化为二进制字节流,并将其写入文件 'data.pkl'

import pickle

data = {'name': 'John', 'age': 30, 'city': 'New York'}

# 序列化
serialized_data = pickle.dumps(data)
with open('data.pkl', 'wb') as file:
file.write(serialized_data)

pickle.loads() 用于将字节流反序列化为原始的数据结构。

import pickle

# 从文件中读取序列化的数据
with open('data.pkl', 'rb') as file:
serialized_data = file.read() # 反序列化
loaded_data = pickle.loads(serialized_data)
print(loaded_data)

需要注意的是,pickle 不是唯一的序列化方法。在实际应用中,你可能还会遇到其他格式,比如 JSON(使用 json 模块)、XML、或者 Protocol Buffers 等,取决于你的需求和使用场景。

反面案例3:

dic = {"name": "admin", "password": 123}
f = open("data.txt", mode="w", encoding="utf-8")
f.write(dic) #运行结果
f.write(dic)
TypeError: write() argument must be str, not dict #write() 方法中传递的参数必须是字符串(str),而不能是字典(dict)

如果你强制转化成字符串去存储这个字典,str(dic)虽然执行会成功

dic = {"name": "admin", "password": 123}
f = open("data.txt", mode="w", encoding="utf-8")
f.write(str(dic))

但是当你重新读取f.read()文件的时候,读取出来的结果依旧是字符串(str),而不是字典(dict)

f = open("data.txt", mode="r", encoding="utf-8")
s = f.read()
print(s, type(s)) #运行结果,依旧是字符串类型
{'name': 'admin', 'password': 123} <class 'str'>

这样,你就不能像字典一样进行关键字取值、循环等操作。

为了解决这个问题,你还得使用eval()进行特殊处理

f = open("data.txt", mode="r", encoding="utf-8")
s = f.read() d = eval(s)
print(d, type(d)) #运行结果
{'name': 'admin', 'password': 123} <class 'dict'>

但是,使用 eval() 函数来解析字符串是一个潜在的安全风险,因为它可以执行任意的 Python 代码,可能导致代码注入或执行恶意代码的风险。强烈建议避免使用 eval() 来解析未知或不可信来源的数据。

在你的情况下,如果你知道文件中包含的是一个合法的字典表示形式,更安全的方法是使用 json 模块来加载 JSON 数据:

import json

with open("data.txt", mode="r", encoding="utf-8") as f:
json_str = f.read() loaded_dict = json.loads(json_str)
print(loaded_dict, type(loaded_dict))

这样,你可以确保加载的数据是一个有效的 JSON 格式,而且不会执行任意的代码。

如果你依然需要处理 Python 字典表示形式而非 JSON,可以使用 ast.literal_eval() 而非 eval(),因为 literal_eval() 更安全,只会解析字面常量,而不会执行任意代码。不过,使用 JSON 通常是更好的选择。

案例4:

把数据存储到文件中最合理的方案就是使用pickle.dump()

dic = {"name": "admin", "password": 123}
with open("data.txt", mode="wb") as f: # f = open("data.txt", mode="wb")
pickle.dump(dic, f)

序列化存储后的文件我们打开后看到的是这样的乱码

读取序列化的文件使用pickle.load()

with open("data.txt", mode="rb") as f:    # f = open("data.txt", mode="rb")
dic = pickle.load(f)
print(dic, type(dic)) #执行结果
{'name': 'admin', 'password': 123} <class 'dict'>

Python——第五章:pickle模块的更多相关文章

  1. Python第五章__模块介绍,常用内置模块

    Python第五章__模块介绍,常用内置模块 欢迎加入Linux_Python学习群  群号:478616847 目录: 模块与导入介绍 包的介绍 time &datetime模块 rando ...

  2. 简学Python第五章__模块介绍,常用内置模块

    Python第五章__模块介绍,常用内置模块 欢迎加入Linux_Python学习群  群号:478616847 目录: 模块与导入介绍 包的介绍 time &datetime模块 rando ...

  3. python(6)- json和pickle模块

    这是用于序列化的两个模块: json: 用于字符串和python数据类型间进行转换 pickle: 用于python特有的类型和python的数据类型间进行转换 Json模块提供了四个功能:dumps ...

  4. python学习_应用pickle模块封装和拆封数据对象

    学习文件数据处理的时候了解到有pickle模块,查找官方文档学习了一些需要用到的pickle内容. 封装是一个将Python数据对象转化为字节流的过程,拆封是封装的逆操作,将字节文件或字节对象中的字节 ...

  5. Python数据存储:pickle模块的使用讲解

    在机器学习中,我们常常需要把训练好的模型存储起来,这样在进行决策时直接将模型读出,而不需要重新训练模型,这样就大大节约了时间.Python提供的pickle模块就很好地解决了这个问题,它可以序列化对象 ...

  6. python数据持久存储-pickle模块

    pickle模块实现了基本的数据序列和反序列化.pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,通过pickle模块的反序列化操作,能够从文件中创建上一次程序保存的对象. 接 ...

  7. Python第五章实验报告

    一.实验项目名称:<零基础学Python>第五章实战.实例以及两道作业题 二.实验目的和要求:了解和掌握操作字符串的方法和正则表达式的应用 三.实验环境:IDLE(Python 3.9 6 ...

  8. python 之 json 与pickle 模块

    序例化:将对象转换为可通过网络传输或可以存储到本地磁盘的数据格式(如:XML.JSON或特定格式的字节串)的过程称为序列化:反之,则称为反序列化. 1.[JSON] import json dic={ ...

  9. 那些年被我坑过的Python——道阻且长(第五章实用模块讲解)

    random模块 我的随机验证吗程序: 首先保证了字母和数字出现的概率是50% VS 50%,其次是可以订制输出多少位 def Captcha(size): Captcha_list = [] for ...

  10. python第五周:模块、标准库

    模块相关知识: 定义:用来从逻辑上组织python代码(变量.函数.类.逻辑:实现一个功能)本质就是以.py结尾的python文件(文件名:test.py,对应的模块名:test) 附注:包:是用来从 ...

随机推荐

  1. 兴达易控modbus转profinet网关三菱变频器通讯

    兴达易控modbus转profinet网关与三菱变频器通讯 本案例分享兴达易控modbus转profinet网关(MDPN100)连接西门子1200plc,实现三菱变频器485通讯兼容转modbusT ...

  2. oracle 问题:ORA-28040:没有匹配的验证协议

    Oracle11g客户端连接Oracle12C服务器端,需配置项 前置条件:已安装Oracle11g客户端,配置好环境变量,用PL/SQL Developer登录数据库 出现问题:登录数据库时,提示& ...

  3. 第五周单元测验题英语教学与互联网 mooc

    第五周单元测验题 返回 本次得分为:16.00/20.00, 本次测试的提交时间为:2020-08-30, 如果你认为本次测试成绩不理想,你可以选择 再做一次 . 1 单选(2分) 从评价的主体来看, ...

  4. 基本操作:vscode-git使用和命令

      Git简介     GIt /git/ 是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到很大的项目版本管理:      通俗的说,解决的问题是: 正常开发,一个团队需要很多人来共同开发 ...

  5. King's Tour 题解

    King's Tour 题面大意 在 \(n\times m\) 的网格中构造一种从 \((1,1)\) 走到 \((a,b)\) 的方案,要求经过所有格子恰好一次,格子之间八联通. 思路分析 模拟赛 ...

  6. 1.NoSQL-lesson14-MongoDB核心技术-运维篇

    逻辑结构 Mongodb 逻辑结构 MySQL逻辑结构 库database 库 集合(collection) 表 文档(document) 数据行 选择之所以称为为选择,肯定是痛苦的! ------& ...

  7. C++对拍模版

    Windows check.cpp #include <bits/stdc++.h> using namespace std; int main() { while( true ) { s ...

  8. 网页全终端h5浏览器视频流解决方案RTSP/FLV/HLS

    背景 项目上需要基于视频巡检,在线勘查填写定制表单,降低巡检成本. 本文着重讲前端部分视频流展示解决方案. 调研 流媒体(streaming media)是指将一连串的媒体数据压缩后,经过网上分段发送 ...

  9. 深入理解maven构建生命周期和各种plugin插件(转)

    https://blog.csdn.net/zhaojianting/article/details/80321488 本博文不会长篇大论的讨论生命周期的概念,而是从各种plugin的实际功能和应用出 ...

  10. 20.7 OpenSSL 套接字SSL加密传输

    OpenSSL 中的 SSL 加密是通过 SSL/TLS 协议来实现的.SSL/TLS 是一种安全通信协议,可以保障通信双方之间的通信安全性和数据完整性.在 SSL/TLS 协议中,加密算法是其中最核 ...