python 序列化_python怎么序列化

2023-11-18

dfab3195c8e3bc38c78fca840409cfd4.png

pickle模块,json模块

(1)把变量从内存中变成可存储或传输的过程,称之为序列化。Python中叫pickling,其他语言中也被称为serialization,marshalling,flattening等,都是相同的意思。

(2)序列化之后,就可以把序列化后的内容(序列化后的内容是一个Bytes)写入磁盘,或者通过网络传输到别的机器上。

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

(4)Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用pickle保存那些不重要的数据,不能成功地反序列化也没关系。

把一个对象序列化并写入文件,有两种方法:

(1)pickle.dumps( )方法: 把任意对象序列化成一个bytes,然后,通过一定方式把这个bytes写入文件。import pickle

d=dict(name='bob',age=23,score=98)

print(pickle.dumps(d))

(2)pickle.dump( )方法: 直接把对象序列化后写入一个file-like Objectimport pickle

d=dict(name='shirley',age=23,score=98)

f=open('dump.txt','wb')  #因为序列化之后是bytes,所以是wb

pickle.dump(d,f)

f.close()

#通过pickle.dump()将对象保存到文件中,通过下面语句可以查看写入的序列化内容

f=open("dump.txt",'rb')#rb

print(f.read())

pickle.dumps( )和pickle.dump( )的区别:就在于中间过程我们是否还需要再做一些操作。

前者我们还要再做一些操作;后者不需要我们再进行任何操作。

同序列化一样,当要把对象从磁盘读到内存时,有两种方法:

(1)pickle.loads( ):可以先把内容读到一个bytes,然后用pickle.loads( )方法反序列化出对象

(2)pickle.load( ):直接用pickle.load( )方法从一个file-like Object中直接反序列化出对象import pickle

f=open('dump.txt','rb')

s=pickle.load(f)

f.close()

print("反序列化后的对象s:",s)

运行结果: 反序列化后的对象s: {'score': 98, 'age': 23, 'name': 'shirley'}

注意:这个反序列化后的对象和原来的变量d是完全不相干的,它们只是内容相同而已。

JSON

Python内置的json模块可以实现从Python对象到JSON格式的转换

(1)JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。

(2)JSON是标准格式,比XML更快,而且可以直接在Web页面中读取。

(3)JSON表示的对象就是标准的JavaScript语言的对象

JSON和Python内置的数据类型对应如下:

JSON类型------Python类型

{ }----------------dict

[ ]----------------list

"string"---------str

1234.56--------int或float

true/false-------True/False

null---------------None

注: 把Python对象转换成JSON格式时,只要是上面表格中列举的Python类型即可,其他类型,例如变量,就会报错。

把Python对象转换成JSON格式:json.dumps( )方法,json.dump( )方法(可以直接把JSON写入一个file-like Object)

要把JSON反序列化为Python对象:json.loads( )方法,json.load( )方法 (前者把JSON的字符串反序列化,后者从file-like Object 中读取字符串并反序列化)

实例:把Python对象变成一个JSONimport json

d=dict(name='shirley',age=23,score=98)

print(json.dumps(d))

print(isinstance(json.dumps(d),str)) #判断序列化后的内容类型

print(type(json.dumps(d)))#判断序列化后的内容类型

运行结果:json.dumps(d): {"name": "shirley", "age": 23, "score": 98}

True

JSON字符串反序列化:import json

json_str = '{"age": 20, "score": 88, "name": "Bob"}'

print(json.loads(json_str))

print(type(json.loads(json_str)))

注:由于JSON标准规定JSON编码是UTF-8,所以我们总是能正确地在Python的字符串str与JSON的字符串之间转换。

JSON进阶

由于Python的字典dict对象在上面表格列举的Python类型中,所以字典dict可以直接序列化为JSON的{ },不过,很多时候,更喜欢用class表示对象,比如定义Student类,然后序列化:import json

class Student(object):

def __init__(self,name,age,score):

self.name=name

self.age=age

self.score=score

s=Student('Nancy',24,89)

print(json.dumps(s))

运行结果:Traceback (most recent call last):

……………………………………

TypeError:  is not JSON serializable

错误的原因是:

Student对象不是一个可序列化为JSON的对象。 如果class的实例对象都无法序列化为JSON,这肯定不合理。(我的理解是class的实例对象s是一个变量,不在上面列举的Python类型中,所以报错)

前面的代码之所以无法把Student类实例序列化为JSON,是因为默认情况下,dumps( )方法不知道如何将Student实例变为一个JSON的{ }对象。

解决办法是:定制JSON序列化####对可选参数default进行设置,把任意class的实例变为dictprint(json.dumps(s, default=lambda obj: obj.__dict__))

通常类class的实例都有一个dict属性,它就是一个dict,用来存储实例变量(注意:是实例变量,即不同实例,该属性存储的变量不同,互不影响)。也有少数例外,比如定义了slots

同理,把JSON反序列化为一个Student对象实例,loads( )方法首先转换出一个dict对象,然后,我们传入的object_hook函数负责把dict转换为Student实例class Student(object):

def __init__(self,name,age,score):

self.name=name

self.age=age

self.score=score

import json

def dict2student(d):

return Student(d['name'], d['age'], d['score'])

json_str = '{"age": 20, "score": 88, "name": "Bob"}'

print(json.loads(json_str))

print(json.loads(json_str, object_hook=dict2student))

运行结果:{'age': 20, 'score': 88, 'name': 'Bob'}

打印出的是反序列化的实例对象。

小结

Python语言特定的序列化模块是pickle,但如果要把序列化搞得更通用、更符合Web标准,就可以使用json模块。

json模块的dumps( )和loads( )函数是定义得非常好的接口的典范。使用时只需要传入一个必须的参数。但是,当默认的序列化或反序列机制不满足我们的要求时,又可以传入更多的参数来定制序列化或反序列化的规则,既做到了接口简单易用,又做到了充分的扩展性和灵活性。

python学习网,免费的在线学习python平台,欢迎关注!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 序列化_python怎么序列化 的相关文章

  • ReID:Harmonious Attention Network for Peson Re-Identification 解读

    最近阅读了CVPR2018的这篇论文 Harmonious Attention Network for Peson Re Identification 论文还是比较容易理解的 下面就简单的解读一下 纯属个人观点 有不同意见的欢迎评论与我探讨
  • 编写程序: 从键盘分别输入年、月、日,判断这一天是当年的第几天

    编写程序 从键盘分别输入年 月 日 判断这一天是当年的第几天 注 判断一年是否是闰年的标准 1 可以被4整除 但不可被100整除或 2 可以被400整除 import java util Scanner public class Test
  • 5G MEC在5G网络中的部署-与UPF的关系

    MEC主机部署在边缘或者核心数据网络中 而UPF负责牵引用户平面流量到目标MEC应用所在的数据网络 网络运营商除了选择数据网络和UPF之外 还需要根据技术和商业因素 例如 站点设施 应用需求 用户负载实测值或估算值 来选择物理计算资源的部署
  • 95-38-050-Buffer-UnpooledHeapByteBuf

    文章目录 1 总述 1 1 局部图 1 2 概述 2 私有字段 3 构造方法 4 设置容量方法 capacity 1 总述 1 1 局部图 1 2 概述 该Bytebuf的底层为不使用对象池技术的JAVA堆字
  • Linux系统查看磁盘可用空间的5个命令

    大家好 我是良许 工作中 经常会遇到磁盘爆满的情况 尤其是一台服务器运行了 N 年之后 里面会充满各种各样垃圾文件 比如 编译产生的中间文件 打包的镜像文件 日志文件 等等 别问我怎么知道 我上家公司服务器就是这样的 我需要每天去删除一些没
  • C++ Primer 学习笔记 第二章 变量和基本类型

    C 是一种静态数据类型语言 它的类型检查发生在编译时 基本内置类型 C 定义了一套包括算数类型和空类型在内的基本数据类型 算数类型 整型 字符 整型数 布尔值 和浮点数 空类型 不对应具体的值 仅用于特殊场合 常见的有函数不返回任何值时用空
  • strlen sizeof详尽分析

    1 char a qwert cout lt
  • 【操作系统】王道考研 p48 文件的逻辑结构

    文件的逻辑结构 知识总览 所谓 逻辑结构 就是在用户看来文件内部的数据如何组织 所谓 物理结构 就是操作系统看来文件的数据如何在外存存放 无结构文件 按文件是否有结构分类 可以分为无结构文件 有结构文件 无结构文件 文件内部的数据就是一系列
  • Cookie 和 Session 详解 及实现用户登陆功能

    Cookie是啥 浏览器提供的在客户端存储数据的一种机制 由于浏览器禁止了网页中的代码直接访问磁盘的文件因此要想再网页中实现数据的持久化存储 就可以使用Cookie这样的机制 Cookie 里面存什么 键值对结构 键和值都是程序猿自定义的
  • 【力扣每日一题】2023.9.21 收集树中金币

    目录 题目 示例 分析 代码 题目 示例 分析 题目给我们一棵树 不过这棵树不是普通的树 而是无向无根树 给我们一个二维数组表示节点之间的连接关系 以及一个一维数组表示每个节点是否有金币 我们可以从任何一个节点出发 并且可以收集距离两格的节
  • [Matlab] 读取excel中较大的数据时不以有效数字形式显示

    问题 excel中存储的数据较大 如501249 91 matlab读取后会以有效数字形式显示 如何使其安装501249 91显示 解决方法 将excel表格中的数据的显示格式设置为文本 将数据以字符串的格式读取到元胞数组中 data xl
  • java visualvm linux_在Linux上使用 Java VisualVM

    前面讲过jvisualvm 远程监控Linux下的java程序 http blog csdn net keketrtr article details 52292089 http blog csdn net keketrtr article
  • java jdbc 多数据源_多数据源使用jdbc连接数据库

    问题提出 问题 多数据源使用jdbc连接数据库 每次连接都是new新连接 for循环多次时new会导致连接创建失败 分析问题 使用数据库连接池技术解决重复创建的问题 具体实现 jdbc连接数据库 package com keep accou
  • 解决node.js+MYSQL读/写date类型数据有异样,且相差8个小时的问题

    既将读 写格式为 2021 05 04T16 00 00 000Z 的数据 转换为本地日期时间 2021 05 05 格式 一 读取异样处理 例如 在数据库中date类型数据原本为 2021 05 05 但是直接打印出来确是下面这样 dat
  • chevereto 页面设置

    我贴一些图 大家可以根据我的设置来搞 或者你可以自定义喽 如果我设置不对 大家也指正一下 可设置的项目非常多 你可以按我的设置来初始化 如果你有什么不满意 自己微调即可 网站 这里值得一说的 搜索 探索 随机 喜欢 粉丝禁用后 这样访客就看
  • 基于贝叶斯算法(bayes)优化卷积神经网络-双向长短期记忆网络(CNN-BILSTM)多变量时间序列预测,bayes-CNN-BILSTM多维时间序列预测。优化参数为:学习率,隐含层节点,正则化

    清空环境变量 warning off 关闭报警信息 close all 关闭开启的图窗 clear 清空变量 clc 清空命令行 导入数据 result1 xlsread 数据集 xlsx result result1 1 300 数据分析
  • 书摘

    因为近几个项目都是基于Linux 平台 于是开始持续关注linux shell 和linux系统管理相关的知识 平时除了阅读在线的博客来汲取这方面的知识 也努力看一些书籍来完善知识体系 而这本
  • 【Pytorch深度学习实战】(11)变分自动编码器(VAE)

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • Windows server 2019搭建证书服务器

    1 安装服务 2 选择角色服务 3 配置CA服务器 指定凭据 选择要配置的角色服务 选择CA的设置类型 指定CA类型 指定私钥类型 指定证书有效期 确认整体配置 确认后就可以开始配置我们的CA服务器 4 配置完成后 申请证书 打开IIS 里

随机推荐