【python3】6.pickle json 序列化

news2024/11/25 12:50:29
2022.11.17 本学习内容总结于莫烦python:6.pickle/json 序列化
https://mofanpy.com/tutorials/python-basic/interactive-python/pickle-json
参考:https://blog.csdn.net/weixin_43625577/article/details/86699789

6 pickle/json 序列化

6.1 序列化

序列化(Serialization):说简单也简单,就是把像字典,列表这类的数据,打包保存在电脑硬盘中。 如果粗略的理解对比,就有点像 zip 和 unzip 的过程。

在程序运行的过程中,所有的变量都是在内存中,比如,定义一个 dict:

a = {'name':'Bob','age':20,'score':90}

字典 a 可以随时修改变量,如果没有把修改后的 'name=Bill’存储到磁盘上,下次重新运行程序,变量又被初始化为 ‘Bob’。

我们把变量从内存中变成可存储或传输的过程称之为序列化,在 Python 中叫 pickling 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。

反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即 unpickling

6.2 pickle

  • pickle 序列化后的数据,可读性差,人一般无法识别;
  • pickle 模块只能在 python 中使用,且只支持同版本,不能跨平台使用;
  • Python 中所有的数据类型(列表,字典,集合,类等)都可以用 pickle 来序列化。
    需导入 pickle 模块 — import pickle

6.2.1 打包字典、列表、元组

以字典为例:

  • 打包pickle.dumps(obj): 把 obj 对象序列化后以 bytes 对象返回,不写入文件
import pickle

data = {"filename": "f1.txt", "create_time": "today", "size": 111}
pickle.dumps(data)
b'\x80\x04\x958\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x08filename\x94\x8c\x06f1.txt\x94\x8c\x0bcreate_time\x94\x8c\x05today\x94\x8c\x04size\x94Kou.'

字典被 pickle 以后,已经面目全非,你不能直接读出来里面的信息,因为这些信息已经被编码了

  • 打包pickle.dump(obj , file) : 序列化对象,并将结果数据流写入到文件对象中

也就是有文件名,要用pickle.dump()

data = {"filename": "f1.txt", "create_time": "today", "size": 111}
with open("data.pkl", "wb") as f:
    pickle.dump(data, f)

import os
os.listdir()
['files', 'data.pkl']

with open() as f:这个是打开文件,结束不用关闭文件。
with open(“data.pkl”, “wb”) as f:打开文件data.pkl,并进行二进制写操作

  • pickle.load(file) : 反序列化对象,将文件中的数据解析为一个Python对象
with open("data.pkl", "rb") as f:
    data = pickle.load(f)
print(data)
{'filename': 'f1.txt', 'create_time': 'today', 'size': 111}

6.2.2 打包 功能以及类

class File:
    def __init__(self, name, create_time, size):
        self.name = name
        self.create_time = create_time
        self.size = size
    
    def change_name(self, new_name):
        self.name = new_name

data = File("f2.txt", "now", 222)
# 存
with open("data.pkl", "wb") as f:
    pickle.dump(data, f)
# 读
with open("data.pkl", "rb") as f:
    read_data = pickle.load(f)
print(read_data.name)
print(read_data.size)

`

f2.txt
222

读的过程就叫:unpickle .你可以按正常的 class 方式使用这个 unpickle 的东西

6.2.3 无法序列化(打包)

有些类型的对象是不能被序列化的。这些通常是那些依赖外部系统状态的对象, 比如打开的文件,网络连接,线程,进程,栈帧等等

class File:
    def __init__(self, name, create_time, size):
        self.name = name
        self.create_time = create_time
        self.size = size
        self.file = open(name, "w")

data = File("f3.txt", "now", 222)
# pickle 存,会报错
with open("data.pkl", "wb") as f:
    pickle.dump(data, f)

报错:self.file = open()打开文件,依赖外部系统状态的对象赋值到了 class 的属性上,,这样的 class 在 pickle 的时候会报错的。

"""
Traceback (most recent call last):
  File "<input>", line 11, in <module>
TypeError: cannot pickle '_io.TextIOWrapper' object
"""
  • 解决方案:用户自定义类可以通过提供 __getstate__()__setstate__()方法来绕过 pickle 的这些限制
class File:
    def __init__(self, name, create_time, size):
        self.name = name
        self.create_time = create_time
        self.size = size
        self.file = open(name, "w")

    def __getstate__(self):
        # pickle 出去需要且能被 pickle 的信息
        pickled = {"name": self.name, "create_time": self.create_time, "size": self.size}
        return pickled

    def __setstate__(self, pickled_dict):
        # unpickle 加载回来,重组 class
        self.__init__(
            pickled_dict["name"], pickled_dict["create_time"], pickled_dict["size"])

data = File("f3.txt", "now", 222)
# 存
with open("data.pkl", "wb") as f:
    pickle.dump(data, f)
# 读
with open("data.pkl", "rb") as f:
    read_data = pickle.load(f)
print(read_data.name)
print(read_data.size)

6.3 JSON

Python 中的 json 库,就是来处理 json 形式的数据的。

import json

data = {"filename": "f1.txt", "create_time": "today", "size": 111}
j = json.dumps(data)
print(j)
print(type(j))
{"filename": "f1.txt", "create_time": "today", "size": 111}
<class 'str'>

需要这样明文来存储数据的话,使用 json.dump()

data = {"filename": "f1.txt", "create_time": "today", "size": 111}
with open("data.json", "w") as f:
    json.dump(data, f)

print("直接当纯文本读:")
with open("data.json", "r") as f:
    print(f.read())

print("用 json 加载了读:")
with open("data.json", "r") as f:
    new_data = json.load(f)
print("字典读取:", new_data["filename"])
直接当纯文本读:
{"filename": "f1.txt", "create_time": "today", "size": 111}
用 json 加载了读:
字典读取: f1.txt

json.load(f) 就把字典取出来了,直接用字典读取方式就可以读数了

6.4 Pickle 和 Json 的不同

在这里插入图片描述
json 相比 pickle 还是有它不及的点。我们上面已经看到,pickle 可以很轻松的打包 Python 的 class。

class File:
    def __init__(self, name, create_time, size):
        self.name = name
        self.create_time = create_time
        self.size = size
    
    def change_name(self, new_name):
        self.name = new_name

data = File("f4.txt", "now", 222)
# 存,会报错

json 不能序列化保存 class。你只能挑出来重要的信息,放到字典或列表里,然后再用json打包字典。 下面就是一段 json 打包 class 会报错的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/13845.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux-RPM与YUM

RPM包 rpm用于互联网下载包的打包及安装工具&#xff0c;它包含在某些Linux分发版中&#xff0c;它生成具有.RPM扩展名的文件&#xff0c;RPM是RedHat Package Manager&#xff08;RedHat软件包管理工具&#xff09;的缩写&#xff0c;类似于windows的setup.exe rpm包的管理 …

【Hack The Box】windows练习-- Timelapse

HTB 学习笔记 【Hack The Box】windows练习-- Timelapse &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &…

原理图与 PCB 绘制备忘

PCB 绘制 考虑到各制板厂的工艺水平的不同&#xff0c;过孔不可过小&#xff0c;最小为 12/25 mil&#xff0c;常用过孔为 16/28 mil 和 24/40mil 。铺铜时&#xff0c;与管脚有连接时做成部分相连。这是因为整体相连后&#xff0c;焊接元器件时因为铜皮散热快而难以化开焊锡。…

如何使用 Spring Data JPA 在存储过程中使用 IN、OUT 和 INOUT 参数

介绍 在本教程中&#xff0c;我将向您展示如何使用 Spring Data JPA 在存储过程中使用 IN、OUT 和 INOUT 参数。我还将调用一个完全没有参数的存储过程。 我将使用 MySQL 服务器&#xff0c;因此 MySQL 服务器可能存在一些限制&#xff0c;或者 Spring Data JPA 本身在调用存…

【网络安全】记一次APP登录爆破

使用工具 安卓12 jadx-gui 抓取登录HTTP请求包 安装burp证书&#xff0c;并抓取登录请求。 POST /loginUser HTTP/1.1 Host: api.xxxx.xxxxx.comapiaccountvrpuc-aaf91f835147ce2d01216bd3bd5c3516&phonexxxx&sign72C132B392873B3F4F6C0872E5EC4B5A&encM%2F8h…

经典排序方法思路简介

参考&#xff1a;https://zhuanlan.zhihu.com/p/166199924&#xff0c;https://www.runoob.com/w3cnote/ten-sorting-algorithm.html **稳定性&#xff1a;**是表示相同值的数据在排序好的结果中的位置前后关系依然不会变&#xff0c;例如[3,1,3],排序后的最后一个3位置不变&am…

java项目-第141期ssm美好生活日志网-ssm毕业设计_计算机毕业设计

java项目-第141期ssm美好生活日志网-ssm毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm美好生活日志网》 该项目分为2个角色&#xff0c;管理员和用户。 用户可以浏览前台,包含功能有&#xff1a; 首页、日记信息、美食信息、景点信息、新闻推荐 、日记展示、论坛信…

【现代密码学原理】——数字签名(学习笔记)

&#x1f4d6; 前言&#xff1a;数字签名&#xff08;又称公钥数字签名&#xff09;是只有信息的发送者才能产生的别人无法伪造的一段数字串&#xff0c;这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。它是一种类似写在纸上的普通的物理签名&#xff0c;但是…

解读JVM级别本地缓存Caffeine青出于蓝的要诀3

Caffeine的异步淘汰清理机制 在惰性删除实现机制这边&#xff0c;Caffeine做了一些改进优化以提升在并发场景下的性能表现。我们可以和Guava Cache的基于容量大小的淘汰处理做个对比。 当限制了Guava Cache最大容量之后&#xff0c;有新的记录写入超过了总大小&#xff0c;会…

HTML---表单详解

目录 一、表单介绍 二、表单元素 1&#xff1a;input输入表单元素 &#xff08;1&#xff09; text和password &#xff08;2&#xff09;radio和checkbox &#xff08;3&#xff09;button 2&#xff1a;label标签 3&#xff1a;select下拉表单元素 4&#xff1a;textar…

喜报 | 强强联手,这件大事终于有着落了

近日&#xff0c;擎创科技与国产数据库领先品牌——达梦数据库达成战略合作伙伴关系&#xff0c;双方将在品牌、产品、技术、渠道等方面进行全方位合作&#xff0c;共同完成产品整合、资源共享、联合方案等事宜&#xff1b;共同赋能于金融、能源、交通等行业的数字化转型&#…

2019年1+X 证书 Web 前端开发中级理论考试题目原题+答案——第一套

&#x1f4da;文章目录 &#x1f3af;关于1X标准 &#x1f3af;关于中级考点 ⏩&#x1f4bb;答案速查 一、单选题&#xff08;每小题2分&#xff0c;共30小题&#xff0c;共60分&#xff09; 二、多选题&#xff08;每小题2分&#xff0c;共15小题&#xff0c;共30分&…

Java入门-Java语言概述

1、Java语言基本概述 1.1、什么是计算机编程语言 人与人之间是如何沟通的呢&#xff1f;从小父母就教会我们说话&#xff0c;在长期的熏陶和自我学习中&#xff0c;我们就学会了普通话&#xff0c;学会了表达自己的需求&#xff0c;父母收到我们的信号或者听到我们的要求也会尽…

C# 自定义控件

一 自定义控件 1 自定义控件的三种方式&#xff1a; 1&#xff09;复合控件&#xff1a;将标准控件组合起来 class YourControl:UserControl{}2) 扩展控件&#xff1a;继承于标准控件 class YourControl:Button{}3) 自定义控件&#xff1a;完全地自定义一个控件 class You…

CSSStyleSheet 对象(css 样式表)- 你不知道的有趣功能

1.概念 CSSStyleSheet 对象 代表着&#xff0c;css文件被浏览器解析后生成的css样式表。 CSS 样式表由 CSS 规则组成&#xff0c;可以通过 CSSRule 对象操作每条规则。CSSStyleSheet 对象允许您查询、插入和删除样式表规则。 例如&#xff1a;好玩儿的尝试&#xff08;改变页…

基于经验论述:实现k-NN算法

以兰普威尔小镇为例,那里的人们为他们的两支球队——兰普威尔红队和兰普威尔蓝队——而疯狂。红队已经存在很长时间了,人们很喜欢这支队伍。 但是后来,一些外地来的富翁买下了红队的最佳射手,成立了一支新的球队——蓝队。令多数红队球迷不满的是,这位最佳射手将继续带领蓝…

数据结构与算法_BST树_BST树的定义及删除操作

先写BST树的定义及特点&#xff0c;然后记录BST数的删除操作。 1 BST定义及特点 BST数是一棵特殊的二叉树&#xff0c;如何能得到一颗二叉搜索树呢&#xff1f;下面一个有序序列&#xff0c;经过二分搜索&#xff0c;得到的就是一颗BST树。根节点就是当前一轮要搜索的中间节点…

Cell子刊:器官再生,这种病可以让受损的肝脏再生

麻风病是由麻风杆菌引起的一种慢性传染病&#xff0c;主要病变在皮肤和周围神经。它是世界上最古老和最顽固的疾病之一&#xff0c;但引起它的细菌也可能具有令人惊讶的生长和再生重要器官的能力。器官再生是治疗疾病、损伤或衰老功能障碍的理想策略&#xff0c;尽管体外模型、…

linux-adnroid 键值枚举与注释

一、概述 没有找到直接的linux 键值枚举的注释。在android 官网linux-android健码网页里找到了这个映射关系。因为android列的比较多。去掉冗余摘取主要对比和注释进表格。 二、术语摘抄解释 HID 用法、Linux 键码和 Android 键码 系统根据抽象层使用几个不同的标识符来引用…

【服务器数据恢复】5节点Lustre分布式文件系统RAID5数据恢复案例

服务器数据恢复环境&#xff1a; 5台服务器节点&#xff0c;每台服务器节点配置一组RAID5&#xff0c;每组6块硬盘&#xff0c;其中1块设置为热备盘。 系统环境为Lustre分布式文件系统&#xff0c;5台服务器共同存储全部的数据文件。 服务器故障&检测&#xff1a; 机房漏水…